萌新求助 有个问题怎么都想不明白
查看原帖
萌新求助 有个问题怎么都想不明白
396400
SenriAkane楼主2022/4/11 01:02

代码如下

#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
const int maxn = 3000;
const ll p = 2333;
int f[maxn][maxn];
ll A[maxn];
int c[maxn][maxn];
ll invA[maxn];
ll quick(ll x,ll n,ll p) {
	ll res = 1;
	while (n>0) {
		if (n&1) res = res*x%p;
		x = x*x%p;
		n>>=1;
	}
	return res;
}
void init(int n,ll p) {
	A[0]=1;
	for (int i=1;i<=n;i++) {
		A[i] = A[i-1]*i%p;
	}
	invA[n] = quick(A[n],p-2,p);
	for (int i=n-1;i>=0;i--) {
		invA[i] = invA[i+1]*(i+1)%p;
		if (invA[i]==0) invA[i]=1;
	}
	
}
ll C(ll n,ll m,ll p) {
	return A[n]*invA[m]%p*invA[n-m]%p;
}
ll Lucas(ll n,ll m,ll p) {
	if (n==0&&m==0) return 1;
	return Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
inline ll F(ll n,ll k)
{
	if(k<0) return 0;
	if(!n) return 1;
	if(!k) return 1;
	if(n<p&&k<p) return f[n][k];
	return (F(n/p,k/p-1)*f[n%p][p-1]%p+Lucas(n/p,k/p,p)*f[n%p][k%p]%p)%p;
}
signed main() {
	init(maxn-1,p);
	for (int i=0;i<maxn-1;i++) {
		c[i][0] = c[i][i] = 1;
	}
	for (int i=2;i<maxn-1;i++) {
		for (int j=1;j<i;j++) {
			c[i][j] = (c[i-1][j]+c[i-1][j-1])%p;
		}
	}
	f[0][0]=1;
	for(int i=1;i<maxn;i++) 
    	f[i][0]=1;
	for(int i=0;i<maxn;i++)
		for(int j=1;j<maxn;j++)
			f[i][j]=(c[i][j]+f[i][j-1])%p;
	int t;
	cin>>t;
	while (t--) {
		ll n,k;
		cin>>n>>k;
		cout<<F(n,k)<<'\n';
	}
	
}

我把main函数中的

	for (int i=0;i<maxn-1;i++) {
		c[i][0] = c[i][i] = 1;
	}
	for (int i=2;i<maxn-1;i++) {
		for (int j=1;j<i;j++) {
			c[i][j] = (c[i-1][j]+c[i-1][j-1])%p;
		}
	}

改成

	for (int i=0;i<maxn;i++) {
		c[i][0] = c[i][i] = 1;
	}
	for (int i=2;i<maxn;i++) {
		for (int j=1;j<i;j++) {
			c[i][j] = (c[i-1][j]+c[i-1][j-1])%p;
		}
	}

答案就不对了 怎么都想不明白 求大佬帮助

2022/4/11 01:02
加载中...