1043 幸运号码
基准时间限制:1 秒 空间限制:131072 KB 分值: 20
1个长度为2N的数,如果左边N个数的和 = 右边N个数的和,那么就是一个幸运号码。
例如:99、1230、123312是幸运号码。
给出一个N,求长度为2N的幸运号码的数量。由于数量很大,输出数量 Mod 10^9 + 7的结果即可。
Input
输入N(1<= N <= 1000)
Output
输出幸运号码的数量 Mod 10^9 + 7
Input示例
1
Output示例
9
思路:dp。
dp[i][j]表示i个数组成的数字的和为j的方案数 ,这个需要两遍dp,一个有前导0,一个没有。
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<queue> 6 #include<math.h> 7 #include<set> 8 #include<vector> 9 #include<string.h> 10 using namespace std; 11 typedef long long LL; 12 int dp[1005][10005]; 13 int dpp[1005][10005]; 14 const int mod = 1e9+7; 15 int main(void) 16 { 17 int i,j,k,n; 18 memset(dp,0,sizeof(dp)); 19 dp[0][0] = 1; 20 scanf("%d",&n); 21 for(i = 0; i < n; i++) 22 { 23 for(j = 0; j <= 10000 ; j++) 24 { 25 if(dp[i][j]==0) 26 break; 27 else {for(int s = 0; s <= 9; s++) 28 { 29 dp[i+1][s+j] = dp[i+1][s+j] + dp[i][j]; 30 dp[i+1][s+j]%=mod; 31 }} 32 } 33 } 34 memset(dpp,0,sizeof(dpp)); 35 dpp[0][0] = 1; 36 for(i = 0; i < n; i++) 37 { 38 if(i==0) 39 { 40 for(j = 0; j <= 10000 ; j++) 41 { 42 if(dpp[i][j]==0) 43 break; 44 else {for(int s = 0; s <= 9; s++) 45 { 46 dpp[i+1][s+j] = dpp[i+1][s+j] + dpp[i][j]; 47 dpp[i+1][s+j]%=mod; 48 } 49 }} 50 } 51 else 52 { 53 for(j = 1; j <= 10000 ; j++) 54 { 55 if(dpp[i][j]==0) 56 { 57 break; 58 } 59 for(int s = 0; s <= 9; s++) 60 { 61 dpp[i+1][s+j] = dpp[i+1][s+j] + dpp[i][j]; 62 dpp[i+1][s+j]%=mod; 63 } 64 } 65 } 66 } 67 LL sum = 0; 68 for(i = 1; i <= 10000; i++) 69 { 70 if(dp[n][j] == 0)break; 71 else 72 { 73 sum = sum + (LL)dp[n][i]*(LL)dpp[n][i]%mod; 74 sum%=mod; 75 } 76 } 77 printf("%lld\n",sum); 78 return 0; 79 }
油!油!you@