1 solutions
-
0
C++ :
#include <iostream> #include <cstdio> using namespace std; struct bign { int len,num[21]; }; bign bign_init(int a) { bign temp={0}; while(a) { temp.num[temp.len++]=a%10000; a/=10000; } return temp; } void bign_print(bign a) { if(a.len==0) { printf("0"); return; } printf("%d",a.num[a.len-1]); for(int i=a.len-2;i>=0;i--) { printf("%04d",a.num[i]); } } bign bign_plus(bign a,bign b) { if(a.len<b.len) a.len=b.len; for(int i=0;i<a.len;i++) { a.num[i]+=b.num[i]; } for(int i=0;i<a.len;i++) { if (a.num[i]>10000) { a.num[i+1]++; a.num[i]-=10000; } } if(a.num[a.len]!=0) a.len++; return a; } int k,w,s,r; bign ans={0}; bign f[1001][1<<9]; int main() { scanf("%d%d",&k,&w); s=(w-1)/k+1; for(int i=0;i<=(1<<k)-1;i++) { f[s][i]=bign_init(1); } for(int i=s-1;i>=2;i--) { for(int j=1;j<=(1<<k)-(s+1-i);j++) { for(int l=j+1;l<=(1<<k)-(s-i);l++) { f[i][j]=bign_plus(f[i][j],f[i+1][l]); } if(!(i==s-1&&j==0)) { ans=bign_plus(ans,f[i][j]); } } } r=(w-1)%k+1; for(int i=1;i<=(1<<r)-1;i++) { for(int j=i+1;j<=(1<<k)-(s-1);j++) { f[1][i]=bign_plus(f[1][i],f[2][j]); } ans=bign_plus(ans,f[1][i]); } bign_print(ans); return 0; }
- 1
Information
- ID
- 654
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By