题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043
题目:
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[i][j]表示长度为i,各位数之和为j的号码的数量(包括前导0),状态转移方程:dp[i][j]=dp[i][j]+dp[i-1][j-k]。最后计算的时候前半部分需要减掉前导0,后半部分不用,然后从0到9*n的对应值相乘求和。
1 #include <iostream> 2 using namespace std; 3 4 typedef long long LL; 5 const int N=1234; 6 const LL mod=1e9+7; 7 LL dp[N][9*N]; 8 9 int main(){ 10 int n; 11 LL ans=0; 12 cin>>n; 13 dp[0][0]=1; 14 for(int i=1;i<=n;i++) 15 for(int j=0;j<=9*n;j++) 16 for(int k=0;k<=9;k++) 17 if(j>=k) dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod; 18 else break; 19 20 for(int i=0;i<=9*n;i++){ 21 ans=(ans+(dp[n][i]-dp[n-1][i])*dp[n][i]%mod)%mod; 22 } 23 cout<<ans<<endl; 24 return 0; 25 }