```cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mxn=520,mod=10;
#define upr(i,x,y) for(int i=x;i<=y;i++)
#define dnr(i,x,y) for(int i=x;i>=y;i--)
int c[mxn][mxn][220],ans[220];
void sum(int tp[],int a[],int b[]){
tp[0]=max(a[0],b[0]);
upr(i,1,tp[0]) tp[i]=a[i]+b[i];
upr(i,1,tp[0]-1) if(tp[i]>=mod) {
tp[i+1]+=tp[i]/mod;tp[i]%=mod;
}
while(tp[tp[0]]>=mod) tp[tp[0]+1]+=tp[tp[0]]/mod,tp[tp[0]++]%=mod;
}
void inc(int tp[],int b[]){
tp[0]=max(tp[0],b[0]);
upr(i,1,tp[0]) tp[i]=tp[i]+b[i];
upr(i,1,tp[0]-1) if(tp[i]>=mod) {
tp[i+1]+=tp[i]/mod;tp[i]%=mod;
}
while(tp[tp[0]]>=mod) tp[tp[0]+1]+=tp[tp[0]]/mod,tp[tp[0]++]%=mod;
}
int main(){
int k,w;
freopen("1.in","r",stdin);
scanf("%d%d",&k,&w);
int len=w/k,rm=w%k,lim;
int mx=(1<<k)-1,y=(1<<rm)-1;
lim=min(mx,len);
upr(i,1,mx) c[i][0][1]=c[i][i][1]=c[i][0][0]=c[i][i][0]=1;
upr(i,1,mx)
upr(j,0,i){
if(j>lim) break;
if(j&&j!=i) sum(c[i][j],c[i-1][j-1],c[i-1][j]);
if(i==mx&&j>=2) {
if(j>lim) break;
inc(ans,c[i][j]);
}
}
upr(i,1,y) {
if(mx-i<len) break;
inc(ans,c[mx-i][len]);
}
dnr(i,ans[0],1) printf("%d",ans[i]);
return 0;
}
代码如下,但是估计没人看。。
```
by _Touch_ @ 2017-05-10 19:05:14
大哥你的文件操作是什么鬼
by deluxurous @ 2017-05-10 19:07:19
@[\_Touch\_](/space/show?uid=19534) 去掉文件操作
by 姚文涛 @ 2017-05-10 19:29:35
交的时候当然去啦。。
by _Touch_ @ 2017-05-10 19:56:59
```cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mxn=520,mod=10;
#define upr(i,x,y) for(int i=x;i<=y;i++)
#define dnr(i,x,y) for(int i=x;i>=y;i--)
int c[mxn][mxn][220],ans[220];
void sum(int tp[],int a[],int b[]){
tp[0]=max(a[0],b[0]);
upr(i,1,tp[0]) tp[i]=a[i]+b[i];
upr(i,1,tp[0]-1) if(tp[i]>=mod) {
tp[i+1]+=tp[i]/mod;tp[i]%=mod;
}
while(tp[tp[0]]>=mod) tp[tp[0]+1]+=tp[tp[0]]/mod,tp[tp[0]++]%=mod;
}
void inc(int tp[],int b[]){
tp[0]=max(tp[0],b[0]);
upr(i,1,tp[0]) tp[i]=tp[i]+b[i];
upr(i,1,tp[0]-1) if(tp[i]>=mod) {
tp[i+1]+=tp[i]/mod;tp[i]%=mod;
}
while(tp[tp[0]]>=mod) tp[tp[0]+1]+=tp[tp[0]]/mod,tp[tp[0]++]%=mod;
}
int main(){
int k,w;
scanf("%d%d",&k,&w);
int len=w/k,rm=w%k,lim;
int mx=(1<<k)-1,y=(1<<rm)-1;
lim=min(mx,len);
upr(i,1,mx) c[i][0][1]=c[i][i][1]=c[i][0][0]=c[i][i][0]=1;
upr(i,1,mx)
upr(j,0,i){
if(j>lim) break;
if(j&&j!=i) sum(c[i][j],c[i-1][j-1],c[i-1][j]);
if(i==mx&&j>=2) {
if(j>lim) break;
inc(ans,c[i][j]);
}
}
upr(i,1,y) {
if(mx-i<len) break;
inc(ans,c[mx-i][len]);
}
dnr(i,ans[0],1) printf("%d",ans[i]);
return 0;
}
交的时候用的这个,但是RE
```
by _Touch_ @ 2017-05-10 19:58:40
@[Antonio](/space/show?uid=22558) 能帮忙看看吗?
by _Touch_ @ 2017-05-12 22:32:49
@[\_Touch\_](/space/show?uid=19534) 数组太大了
by R_W_Y @ 2017-05-16 15:10:04
~~新人求助,P1066那题,本机AC提交RE。。。~~
by Monkey_Hunter @ 2020-02-24 18:45:28