代码如下
#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;
}
}
答案就不对了 怎么都想不明白 求大佬帮助