Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
贴一个不打表的算法Source Code Problem: 3556 User: test_3556 Memory: 40500K Time: 954MS Language: C++ Result: Accepted Source Code #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cmath> #include<stdio.h> using namespace std; int vl[9366825],list[1000000],cnt_list; bool vis[9366825]; int c[48][48],wss[48][48][7],ax; int n,b,mod=1000000000; int dfs(int num[],int state) { int i,j; if(num[b]==0) return 1; if(vis[state]) return vl[state]; list[cnt_list++]=state; int nstate=state; int tmp[6]; for(i=0;i<=b;i++) tmp[i]=num[i]; vis[state]=true; vl[state]=0; long long ret=0; for(i=b;i>0;i--) { if(num[i]<=0) break; tmp[i]--; nstate-=c[tmp[i]+i+1][i]; for(j=num[i];j>num[i-1];j--) { if(i==1) j=1; nstate-=wss[tmp[i-1]][j-1][i]; tmp[i-1]=j-1; if(vis[nstate]) ret+=vl[nstate]; else ret+=dfs(tmp,nstate); } } vl[state]=ret%mod; return vl[state]; } int f() { int i,j,res,state=0; int num[6]={0},big=0; num[b]=n; for(i=0;i<=b;i++) state+=c[num[i]+i+1][i+1]; cnt_list=0; res=dfs(num,state); for(i=0;i<cnt_list;i++) vis[list[i]]=false; return res; } int main() { int v[6],i,j,s,p,q,k,num_st=0; for(i=0;i<=47;i++) for(j=0;j<=6;j++) { if(j==0||j==i) c[i][j]=1; else c[i][j]=c[i-1][j-1]+c[i-1][j]; } for(i=0;i<=40;i++) for(j=0;j<=40;j++) for(s=0;s<=6;s++) wss[i][j][s]=c[i+s][s]-c[j+s][s]; scanf("%d%d",&n,&b); int ans=f();; b--; ans=(ans-f()+mod)%mod; b++; printf("%d\n",ans); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator