4 条题解
-
0
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #define N 66 #define ull unsigned long long using namespace std; ull s2[N][N]; void init(int n){ s2[0][0] = 1; for(int i=1;i<=n;++i) for(int j=1;j<=i;++j) s2[i][j] = j*s2[i-1][j] + s2[i-1][j-1]; } inline ull coef(ull n,int j){ ull res = 1; for(int i=0;i<j;++i){ if((n-i)%j) res *= n-i; else res *= (n-i)/j; } return res; } inline ull solve(ull n,int k){ // \sum_{i=0}^{n-1} i^k ull res = 0; for(int j=0;j<=k;++j) res += s2[k][j]*coef(n,j+1); return res; } inline void multiply(const ull *f,const ull *g,int n,ull *r){ static ull h[N]; for(int i=0;i<=n;++i) h[i] = 0; for(int i=0;i<=n;++i) for(int j=0;j<=i;++j) h[i] += f[j]*g[i-j]; for(int i=0;i<=n;++i) r[i] = h[i]; } inline void power(ull *f,int n,int k,ull *r){ static ull g[N]; g[0] = 1; for(int i=1;i<=n;++i) g[i] = 0; while(k){ if(k&1) multiply(g,f,n,g); multiply(f,f,n,f); k >>= 1; } for(int i=0;i<=n;++i) r[i] = g[i]; } int k; ull n,ans; ull f[N]; int main(){ init(64); scanf("%d%llu",&k,&n); if(k<64) ans = solve(n,k); else{ f[0] = f[1] = 1; power(f,63,k,f); n >>= 1; for(int j=0;j<=63;++j) ans += (f[j]<<j)*solve(n,j); } printf("%llu",ans); return 0; }
信息
- ID
- 3214
- 时间
- 200ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 15
- 已通过
- 2
- 上传者