在自己的电脑和codevs上测试没问题

P1066 [NOIP2006 提高组] 2^k进制数

```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


|