首页 > 代码库 > 1043 幸运号码

1043 幸运号码

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         else52         {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         else72         {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 }

 

1043 幸运号码