4 条题解
-
0
#include<bits/stdc++.h> #define int unsigned long long using namespace std; namespace IO{ char buff[1<<21],*p1=buff,*p2=buff; char getch(){ return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++; } template<typename T> void read(T &x){ char ch=getch();int fl=1;x=0; while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();} while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();} x*=fl; } template<typename T,typename ...Args> void read(T &x,Args& ...args){ read(x);read(args...); } char obuf[1<<21],*p3=obuf; void putch(char ch){ if(p3-obuf<(1<<21))*p3++=ch; else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch; } char ch[100]; template<typename T> void write(T x){ if(!x)return putch('0'); if(x<0)putch('-'),x*=-1; int top=0; while(x)ch[++top]=x%10+48,x/=10; while(top)putch(ch[top]),top--; } template<typename T,typename ...Args> void write(T x,Args ...args){ write(x);write(args...); } void flush(){fwrite(obuf,p3-obuf,1,stdout);} } using namespace IO; const int MAXN=64,mod=(1ull<<63); inline int poww(int x,int y){ int sum=1; while(y){ if(y&1)sum*=x; x=x*x; y>>=1; } return sum; } int P[MAXN]; map<int,map<int,int>>f,C; inline int solve(int n,int m){ if(n==1)return (m==0?1:0); if(f[m][n])return f[m][n]; if(n&1)return f[m][n]=solve(n-1,m)+poww(n-1,m); int sum=(m<MAXN?P[m]*solve(n/2,m):0); for(int i=0;i<=m&&i<MAXN;i++)sum+=P[i]*C[m][i]*solve(n/2,i); return f[m][n]=sum; } signed main(){ P[0]=1,C[0][0]=1; int n,m; read(m,n); for(int i=1;i<MAXN;i++)P[i]=P[i-1]+P[i-1]; for(int i=1;i<MAXN;i++) for(int j=C[i][0]=1;j<=i;j++) C[i][j]=C[i-1][j]+C[i-1][j-1]; for(int i=0;i<=m&&i<MAXN;i++){ C[m][i]=1; int sum=0; for(int j=1;j<=i;j++){ int x=m-j+1; while(!(x&1))sum++,x>>=1; C[m][i]*=x; } for(int j=1;j<=i;j++){ int x=j; while(!(x&1))sum--,x>>=1; C[m][i]*=poww(x,mod-1); } if(sum<MAXN)C[m][i]*=P[sum]; else C[m][i]=0; } write(solve(n,m)); flush(); return 0; }
信息
- ID
- 3214
- 时间
- 200ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 15
- 已通过
- 2
- 上传者