定理[ルーカス]羅区P4345

水問題について書いて怠惰正午に優れたものです[]

\(\和\ limits_ {I = 0} ^ K \ binom {n}は{I} \; MOD \; 2333 \)

] [非常に小さいAモジュラス必ずルーカスを見て

ルーカス定理:\(\ {N-Binom} {K} = \ {N-Binom / MOD {K} / * MOD} \ {N-Binom%MOD%MOD K} {} \)

次いで] [[ハッピー分割ブロック波で、その後同様のアイテムの幸福合併の波

\(F(N、K)= \和\ limits_ {I = 0} ^ K \ binom {n}は{I} \)

于是有\(F(N、K)= F(N / V、K / MOD-1)* F(N \%Vは、V-1)+ \和\ limits_ {I = 0} ^ {K \% V} \ {N binom / V {K} / V} \ {N binom \%} {V I} \)

快楽の波に再帰処理[]

[私はに、ああ、[A]はありませんTのメモリマップを使用する理由言っ]を

#include <bits/stdc++.h>
#define ll long long
#define For(i,x,y) for(int i=(x);i<=(y);++i)
#define Rof(i,x,y) for(int i=(x);i>=(y);--i)
#define mod 2333
using namespace std;
int pre[2334][2334],C[2334][2334];
int Lucas(ll x,ll y){
    if(!y) return 1;
    if(x<y) return 0;
    if(x==y) return 1;
    return C[x%mod][y%mod]*Lucas(x/mod,y/mod)%mod;
}
int F(ll n,ll k){
    if(k<0 || n<0) return 0;
    if(k<mod && n<mod) return pre[n][k];
    return (1ll*Lucas(n/mod,k/mod)*pre[n%mod][k%mod]%mod+1ll*F(n/mod,k/mod-1)*pre[n%mod][mod-1]%mod)%mod;
}
int main(){
    ll n,k;int T;
    For(i,0,mod) C[i][0]=1;
    For(i,1,mod) For(j,1,i) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
    For(i,0,mod) pre[i][0]=1;
    For(i,0,mod) For(j,1,mod-1) pre[i][j]=(pre[i][j-1]+C[i][j])%mod;
    scanf("%d",&T);
    while(T--){
        scanf("%lld%lld",&n,&k);
        printf("%d\n",F(n,k));
    }
}

おすすめ

転載: www.cnblogs.com/PsychicBoom/p/11966212.html