2 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int mod=1e9; struct node { int len,a[23]; node(){memset(a,0,sizeof(a));len=1;} }; node operator+ (node n1,node n2) { node no;no.len=max(n1.len,n2.len); for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]+n2.a[i]; for(int i=1;i<=no.len;i++)no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; int i=no.len; while(no.a[i+1]>0) { i++,no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; } no.len=i; return no; } node f[512][512];//f[i][j]表示从1-j里面选i个 void putnum(int x) { int t=mod/10; while(x<t) printf("0"),t/=10; if(x>0) printf("%d",x); } int main() { int k,w;scanf("%d%d",&k,&w); int n=(w+k-1)/k;//位数 int mk=(1<<k)-1; if(n>mk) n=mk; for(int i=1;i<=mk;i++)f[1][i].a[1]=i; for(int i=2;i<=n;i++) { for(int j=i;j<=mk;j++) f[i][j]=f[i-1][j-1]+f[i][j-1]; } node ans; int ww=w%k;if(ww==0)ww=k; int st=(1<<ww)-1; for(int j=1;j<=st;j++) ans=ans+f[n-1][mk-j]; for(int i=n-1;i>=2;i--)ans=ans+f[i][mk]; printf("%d",ans.a[ans.len]); for(int i=ans.len-1;i>=1;i--)putnum(ans.a[i]); return 0; }#include<bits/stdc++.h>//暴力O(n^3) using namespace std; const int mod=1e9; struct node { int len,a[23]; node(){memset(a,0,sizeof(a));len=1;} }; node operator+ (node n1,node n2) { node no;no.len=max(n1.len,n2.len); for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]+n2.a[i]; for(int i=1;i<=no.len;i++)no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; int i=no.len; while(no.a[i+1]>0) { i++,no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; } no.len=i; return no; } node f[1100][512]; void putnum(int x) { int t=mod/10; while(x<t) printf("0"),t/=10; if(x>0) printf("%d",x); } int main() { int k,w;scanf("%d%d",&k,&w); int n=(w+k-1)/k;//位数 int mk=(1<<k)-1; for(int j=0;j<=mk;j++)f[1][j].a[1]=1; for(int i=2;i<=n;i++) { for(int j=1;j<=mk;j++) for(int jj=j+1;jj<=mk;jj++) f[i][j]=f[i][j]+f[i-1][jj]; } node ans; int ww=w%k;if(ww==0)ww=k; int st=(1<<ww)-1; for(int j=1;j<=st;j++) ans=ans+f[n][j]; for(int i=n-1;i>=2;i--) for(int j=1;j<=mk;j++) ans=ans+f[i][j]; printf("%d",ans.a[ans.len]); for(int i=ans.len-1;i>=1;i--)putnum(ans.a[i]); return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int mod=1e9; struct node { int len,a[23]; node(){memset(a,0,sizeof(a));len=1;} }; node operator+ (node n1,node n2) { node no;no.len=max(n1.len,n2.len); for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]+n2.a[i]; for(int i=1;i<=no.len;i++)no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; int i=no.len; while(no.a[i+1]>0) { i++,no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; } no.len=i; return no; } node f[512][512];//f[i][j]表示从1-j里面选i个 void putnum(int x) { int t=mod/10; while(x<t) printf("0"),t/=10; if(x>0) printf("%d",x); } int main() { int k,w;scanf("%d%d",&k,&w); int n=(w+k-1)/k;//位数 int mk=(1<<k)-1; if(n>mk) n=mk; for(int i=1;i<=mk;i++)f[1][i].a[1]=i; for(int i=2;i<=n;i++) { for(int j=i;j<=mk;j++) f[i][j]=f[i-1][j-1]+f[i][j-1]; } node ans; int ww=w%k;if(ww==0)ww=k; int st=(1<<ww)-1; for(int j=1;j<=st;j++) ans=ans+f[n-1][mk-j]; for(int i=n-1;i>=2;i--)ans=ans+f[i][mk]; printf("%d",ans.a[ans.len]); for(int i=ans.len-1;i>=1;i--)putnum(ans.a[i]); return 0; }
#include<bits/stdc++.h>//暴力O(n^3) using namespace std; const int mod=1e9; struct node { int len,a[23]; node(){memset(a,0,sizeof(a));len=1;} }; node operator+ (node n1,node n2) { node no;no.len=max(n1.len,n2.len); for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]+n2.a[i]; for(int i=1;i<=no.len;i++)no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; int i=no.len; while(no.a[i+1]>0) { i++,no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; } no.len=i; return no; } node f[1100][512]; void putnum(int x) { int t=mod/10; while(x<t) printf("0"),t/=10; if(x>0) printf("%d",x); } int main() { int k,w;scanf("%d%d",&k,&w); int n=(w+k-1)/k;//位数 int mk=(1<<k)-1; for(int j=0;j<=mk;j++)f[1][j].a[1]=1; for(int i=2;i<=n;i++) { for(int j=1;j<=mk;j++) for(int jj=j+1;jj<=mk;jj++) f[i][j]=f[i][j]+f[i-1][jj]; } node ans; int ww=w%k;if(ww==0)ww=k; int st=(1<<ww)-1; for(int j=1;j<=st;j++) ans=ans+f[n][j]; for(int i=n-1;i>=2;i--) for(int j=1;j<=mk;j++) ans=ans+f[i][j]; printf("%d",ans.a[ans.len]); for(int i=ans.len-1;i>=1;i--)putnum(ans.a[i]); return 0; }
- 1
信息
- ID
- 31
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 50
- 已通过
- 16
- 上传者