4 条题解
-
0
#include<bits/stdc++.h> #define ull unsigned long long using namespace std; struct modint { ull x; int pw2; modint(){x=0,pw2=0;} modint(ull _x,int _pw2){x=_x,pw2=_pw2;} modint(ull val) { assert(val); pw2=__builtin_popcountll(val^val-1)-1; x=val>>pw2; } }; ull decode(modint x) { assert(x.pw2>=0); return x.x<<x.pw2; } ull inv(ull x) { assert(x&1); ull ret=1; for(int i=63;i--;)ret=ret*x,x=x*x; return ret; } modint inv(modint x) { return modint{inv(x.x),-x.pw2}; } modint operator*(modint x,modint y) { return modint{x.x*y.x,x.pw2+y.pw2}; } ull qpow(ull x,ull y) { ull ret=1; while(y) { if(y&1)ret=ret*x; x=x*x; y>>=1; } return ret; } modint Inv[70],fac[70],invfac[70]; ull pwm[70]; ull n,m; int main() { scanf("%llu%llu",&m,&n); if(m==0) { printf("%llu\n",n); return 0; } for(int i=0;i<=65;i++)pwm[i]=qpow(i,m); fac[0]=invfac[0]=modint(1); for(int i=1;i<=65;i++)fac[i]=fac[i-1]*modint(i),invfac[i]=inv(fac[i]); modint binom=modint(n); ull ans=0; for(int t=1;t<=65&&t<=m&&t<n;t++) { binom=binom*modint(n-t); binom=binom*inv(modint(t+1)); ull stirling=0; for(int k=0;k<=t;k++) { ull x=decode(fac[t]*invfac[k]*invfac[t-k])*pwm[k]; if(t-k&1)stirling-=x; else stirling+=x; } ans+=decode(binom)*stirling; } printf("%llu\n",ans); return 0; }
信息
- ID
- 3214
- 时间
- 200ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 15
- 已通过
- 2
- 上传者