小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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App