首页 > 其他分享 >HNCPC2019

HNCPC2019

时间:2023-03-24 18:15:02浏览次数:49  
标签:HNCPC2019 int void solve mp ans MOD

全 1 子矩阵

分析:

扩范围,到最后看面积是否等于1的个数

实现:

int T;
int sum;
int n, m;
char g[N][N];
void solve()
{
    sum = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> g[i] + 1;
    }
    int x1 = n + 1, x2 = 0, y1 = m + 1, y2 = 0;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            if (g[i][j] == '1')
                x1 = min(x1, i), x2 = max(x2, i), y1 = min(y1, j), y2 = max(y2, j), sum++;

    if (sum && sum == (y2 - y1 + 1) * (x2 - x1 + 1))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
}
signed main()
{
    FAST;
    T = 1;
    // cin >> T;
    while (cin >> n >> m)
        solve();
    return 0;
}

组合数

分析:

计算组合数,乘大的除小的,1^18要开__int128或者直接高精度

实现:

void solve()
{
    k = min(k, n - k);
    __int128 q = 1;
    for (int i = 0; i < k; i++)
    {
        q *= (n - i);
        q /= (i + 1);
        if (q >= 1e18 || q <= 0)
        {
            q = 1e18;
            break;
        }
    }

    cout << (int)q << endl;
}

Numbers

题意:

多个不同的数构成一个串,不带前导0,求拆分方案数

分析:

len小于50,DFS

实现:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 20010, MOD = 1e9 + 7;
int T;
string s;
map<int, int> mp;
int res, len;
void dfs(int u)
{
    if (u > len)
    {
        res++;
        return;
    }

    int t = s[u] - '0';
    if (!mp[t])
    {
        mp[t]++;
        dfs(u + 1);
        mp[t]--;
    }

    if (s[u] != '0' && u + 1 <= len)
    {
        int now = t * 10 + s[u + 1] - '0';
        if (mp[now])
        {
            return;
        }
        else
        {
            mp[now]++;
            dfs(u + 2);
            mp[now]--;
        }
    }
}
void solve()
{
    s = " " + s;
    len = s.size() - 1;
    mp.clear();
    res = 0;

    dfs(1);

    cout << res << endl;
}
signed main()
{
    FAST;
    T = 1;
    // cin >> T;
    while (cin >> s)
        solve();
    return 0;
}

4 Buttons

题意:

在(0,0)点向四个方向,每个方向一次最多走的步数不同,最多走 n 次,求可以经过的点的数量

分析:

求面积,等差求和

实现:

void solve()
{
    int ans = 1;
    ans = (ans + (((a * b % MOD) * n % MOD) * (n - 1) % MOD) * inf % MOD) % MOD;
    ans = (ans + (((a * d % MOD) * n % MOD) * (n - 1) % MOD) * inf % MOD) % MOD;
    ans = (ans + (((c * b % MOD) * n % MOD) * (n - 1) % MOD) * inf % MOD) % MOD;
    ans = (ans + (((c * d % MOD) * n % MOD) * (n - 1) % MOD) * inf % MOD) % MOD;
    ans = (ans + (((n * a % MOD + n * b % MOD) % MOD + n * c % MOD) % MOD + n * d % MOD) % MOD) % MOD;
    cout << ans << endl;
}

标签:HNCPC2019,int,void,solve,mp,ans,MOD
From: https://www.cnblogs.com/Aidan347/p/17252937.html

相关文章