标签:des style http io color os ar java for
1 2 3 40 50 600 700
Case 1: 1 Case 2: 1 Case 3: 2 Case 4: 924 Case 5: 1998 Case 6: 315478277 Case 7: 825219749
对于每个合法图形,记最底层个数为j,则再增加一层增加的个数必须是j的倍数。可以用dp[i][j]表示i个点最底层为j个时的个数,对于数据范围内的N遍历得到答案。(属于“我为人人”型的递推关系)
dp[i][j]-->dp[i+j*k][j*k](k=1...N)
#include <iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define N 1010 #define LL __int64 const int mod=1000000007; int f[N][N],ans[N]; void inti() { int i,j,k; memset(f,0,sizeof(f)); f[1][1]=1; for(i=1;i<=1000;i++) { for(j=1;j<=1000;j++) { if(f[i][j]==0) //由当前合法状态推得其他状态 continue; for(k=1;k<=1000;k++) { int t1=j*k; int t2=t1+i; if(t2>1000) break; f[t2][t1]+=f[i][j]; if(f[t2][t1]>=mod) f[t2][t1]%=mod; } } } for(i=1;i<=1000;i++) { int tmp=0; for(j=1;j<=i;j++) tmp=(tmp+f[i][j])%mod; ans[i]=tmp; } } int main() { int n,cnt=1; inti(); while(scanf("%d",&n)!=-1) { printf("Case %d: %d\n",cnt++,ans[n]); } return 0; }
标签:des style http io color os ar java for
原文地址:http://blog.csdn.net/u011721440/article/details/40591959