小F的五子棋

小F的五子棋

在拿上高精度模板后,如何求呢?
这里由于组合数必定能整除,直接计算上面和下面的素数个数,相减,最后再相乘即可

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
// #define int long long
#define _u_u_ ios::sync_with_stdio(false), cin.tie(nullptr)
int mod = 1e9 + 7;
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
vector<int> mul(vector<int> A, int b) { // C = A * b, A >= 0, b >= 0 , 低位在前
    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size() || t; i ++ )
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}
bool st[maxn];
int primes[maxn],cnt;
void ols (int n)  // 线性筛质数
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] <= n / i; j ++ )
    {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}
int num[maxn];
int cal(int u,int pr) {
    int ct = 0;
    for (int i = 2;i <= u;i++) {
        int t = i;
        while (t % pr == 0) {
            ct++;
            t /= pr;
        }
    }
    return ct;
}
inline void _A_A_() {
    ols(10010);
    int m, n;
    cin >> n >> m;  // C(n * m, n * m / 2);
    int up = n * m / 2;
    int down = n * m;
    for (int i = 0;i < cnt;i++) {
        num[i] = cal(down,primes[i]) - cal(up,primes[i]) - cal(down - up, primes[i]);
    }
    vector<int> ans;
    ans.push_back(1);
    for (int i = 0;i < cnt;i++) {
        for (int k = 0; k < num[i];k++) {
            ans = mul(ans, primes[i]);
        }
    }
    for (int i = ans.size() - 1;i >= 0;i--) {
        cout << ans[i];
    }
}

signed main() {
    _u_u_;
    int _o_o_ = 1;
    // cin >> _o_o_;
    while (_o_o_--){_A_A_();}return 0;
}
posted @   Uzhia  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示