社区讨论

组合数线性递推公式出了什么问题了吗

P1313[NOIP 2011 提高组] 计算系数参与者 5已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mi6xmapi
此快照首次捕获于
2025/11/20 12:29
4 个月前
此快照最后确认于
2025/11/20 12:29
4 个月前
查看原帖
(nm)=n!m!(nm)!=n!(nm+1)m(m1)!(nm+1)!=nm+1m(nm1)\dbinom{n}{m}=\frac{n!}{m!(n-m)!}=\frac{n!(n - m + 1)}{m(m-1)!(n-m+1)!}=\frac{n-m+1}{m}\dbinom{n}{m-1}
为什么下面的代码退出来的组合数是错误的呢?问题是出在取模上了吗?
CPP
#include<bits/stdc++.h>

using namespace std;

const int mod = 10007;

int c(int n, int m) {
	if(m == 0) return 1;
	return (c(n, m - 1) * (n - m + 1) / m) % mod;
}

long long QPow(long long a, long long b) 
{
    long ans = 1, base = a;
    while(b) {
        if(b & 1) ans = ans * base % mod;
        base = base * base % mod;
        b >>= 1;
    }
    return ans;
}

int a, b, k, n, m;

void inline Init()
{
	cin >> a >> b >> k >> n >> m;
	a %= mod, b %= mod;
}

int inline Solve()
{
	return c(k, m) * QPow(a, n) % mod * QPow(b, m) % mod;
}

int main()
{
	Init();
//	cout << c(k, m) << endl << QPow(a, n) << endl << QPow(b, m) << endl; 这里发现算出的组合数是错误的
	cout << Solve() << endl;
	return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...