曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加
强大的粒子流的神秘装置。超能粒子炮·改相比超能粒子炮,在威力上有了本质的提升。它有三个参数n,k。它会
向编号为0到k的位置发射威力为C(n,k) mod 2333的粒子流。现在SHTSC给出了他的超能粒子炮·改的参数,让你求
其发射的粒子流的威力之和模2333。
BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 2550 typedef long long ll; const int mod=2333; int c[N][N],f[N][N]; void init() { int i,j; for(i=0;i<=mod;i++) c[i][0]=f[i][0]=1; for(i=0;i<=mod;i++) { for(j=1;j<=i;j++) { c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; f[i][j]=(f[i][j-1]+c[i][j])%mod; } for(j=i+1;j<=mod;j++) f[i][j]=f[i][j-1]; } } int Lucas(ll n,ll m) { if(n<m) return 0; if(n<mod&&m<mod) return c[n][m]; return Lucas(n/mod,m/mod)*Lucas(n%mod,m%mod)%mod; } int solve(ll n,ll k) { ll a=k/mod;int b=k%mod; if(k<mod) return f[n%mod][k]; return (solve(n%mod,mod-1)*solve(n/mod,a-1)%mod+Lucas(n/mod,a)*solve(n%mod,b)%mod)%mod; } int main() { init(); int T; scanf("%d",&T); ll n,k; while(T--) { scanf("%lld%lld",&n,&k); printf("%d\n",solve(n,k)); } }
BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理
原文:https://www.cnblogs.com/suika/p/9186369.html