码迷,mamicode.com
首页 > 其他好文 > 详细

51Nod_1043_幸运号码

时间:2018-01-25 21:47:11      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:htm   max   ret   efi   define   cout   names   sum   namespace   

dp[i][j] = dp[i - 1][j - t](t:0 to 9) 
前面部分开头不能为0;这里去掉0的方法是dp[n & 1][i] - dp[(n - 1) & 1][i]
ans = (ans + dp[n & 1][i] * (dp[n & 1][i] - dp[(n - 1) & 1][i])) % mod; 

链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043

#include<cstdio>
#include<time.h>
#include
<algorithm> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<cstring> #include<cstdlib> #include<utility>//pair #define getrand(a,b) (int)((rand()/33000.0)*((b)-(a)+1))+(a) #define p pair<int,int> using namespace std; typedef long long LL; const int maxnn=100+5; const int maxn=100000+5; const int mod=1e9+7; //dp[i][j]:i--位数,j--和(含开头为0) LL dp[2][9009]; int main() { int n,k=10; cin>>n; if(n==1)cout<<9;
//init memset(dp,
0,sizeof(dp)); for(int i=0;i<k;i++)dp[1][i]=1; dp[0][1]=1;
//
for(int i=2;i<=n;i++){ k+=9; for(int j=0;j<k;j++){ LL sum=0; for(int t=0;t<10&&j>=t;t++) sum+=dp[(i&1)^1][j-t]; sum%=mod; dp[i&1][j]=sum; } }
//
LL ans=0; for(int i=1;i<k;i++) ans+=(dp[n&1][i]*((dp[n&1][i]-dp[(1&n)^1][i]+mod)%mod))%mod;//加上mod是怕减完后是负数(其实只要最后来一下就可以了,但从结果看好像多虑了) cout<<ans%mod<<endl; return 0; }

 

51Nod_1043_幸运号码

标签:htm   max   ret   efi   define   cout   names   sum   namespace   

原文地址:https://www.cnblogs.com/Gsimt/p/8353045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!