您的位置:首页 > 其它

1043 幸运号码

2016-09-05 12:41 232 查看
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,一个没有。


#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<queue>
#include<math.h>
#include<set>
#include<vector>
#include<string.h>
using namespace std;
typedef long long LL;
int dp[1005][10005];
int dpp[1005][10005];
const int mod = 1e9+7;
int main(void)
{
int i,j,k,n;
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
scanf("%d",&n);
for(i = 0; i < n; i++)
{
for(j = 0; j <= 10000 ; j++)
{
if(dp[i][j]==0)
break;
else {for(int s = 0; s <= 9; s++)
{
dp[i+1][s+j] = dp[i+1][s+j] + dp[i][j];
dp[i+1][s+j]%=mod;
}}
}
}
memset(dpp,0,sizeof(dpp));
dpp[0][0] = 1;
for(i = 0; i < n; i++)
{
if(i==0)
{
for(j = 0; j <= 10000 ; j++)
{
if(dpp[i][j]==0)
break;
else {for(int s = 0; s <= 9; s++)
{
dpp[i+1][s+j] = dpp[i+1][s+j] + dpp[i][j];
dpp[i+1][s+j]%=mod;
}
}}
}
else
{
for(j = 1; j <= 10000 ; j++)
{
if(dpp[i][j]==0)
{
break;
}
for(int s = 0; s <= 9; s++)
{
dpp[i+1][s+j] = dpp[i+1][s+j] + dpp[i][j];
dpp[i+1][s+j]%=mod;
}
}
}
}
LL sum = 0;
for(i = 1; i <= 10000; i++)
{
if(dp
[j] == 0)break;
else
{
sum = sum + (LL)dp
[i]*(LL)dpp
[i]%mod;
sum%=mod;
}
}
printf("%lld\n",sum);
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: