51Nod_1043_幸运号码

Posted gsimt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod_1043_幸运号码相关的知识,希望对你有一定的参考价值。

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_幸运号码的主要内容,如果未能解决你的问题,请参考以下文章

51Nod 1043 幸运号码 数位DP

51nod1043 幸运号码(数位dp)

51nod 1043 幸运号码(数位dp)

AC日记——幸运号码 51nod 1043

1043 幸运号码 数位DP

1043 幸运号码