一个主要问题就是364875103=97*3761599;
#include <cstdio> #include <iostream> #include <cstdlib> #define M (364875103LL) #define M1 (97LL) #define M2 (M/M1) #define LL long long using namespace std; LL fac1[M1+9],fac2[M2+9]; LL mod(LL a,LL b,LL m) { a%=m; LL ans=1; while(b) { if(b&1) ans=ans*a%m; a=a*a%m; b>>=1; } return ans; } LL inv(LL a,LL m) { return mod(a,m-2,m); } LL C(int n,int m,LL mod,LL *fac) { if(n<m) return 0; return fac[n]*inv(fac[n-m]*fac[m],mod)%mod; } LL lucas(int n,int m,LL mod,LL *fac) { if(m==0) return 1; return C(n%mod,m%mod,mod,fac)*lucas(n/mod,m/mod,mod,fac); } int main() { int T,cas=1; int a[20]; fac1[0]=fac2[0]=1; for(LL i=1;i<M1;i++) fac1[i]=fac1[i-1]*i%M1; for(LL i=1;i<M2;i++) fac2[i]=fac2[i-1]*i%M2; LL inv1=inv(M1,M2)*M1,inv2=inv(M2,M1)*M2; scanf("%d",&T); while(T--) { int n,m,k; scanf("%d %d",&n,&m); int now,pre=0; LL a1,a2,ans=1; scanf("%d",&k); for(int i=0;i<k;i++) scanf("%d",&a[i]); a[k]=m; for(int i=0;i<k;i++) { a1=lucas(n+a[i+1]-a[i]-1,a[i+1]-a[i],M1,fac1); a2=lucas(n+a[i+1]-a[i]-1,a[i+1]-a[i],M2,fac2); LL aa=(a1*inv2+a2*inv1)%M; ans=ans*(aa)%M; } printf("Case #%d: %I64d\n",cas++,ans); } return 0; }