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; }

 

转载于:https://www.cnblogs.com/Gsimt/p/8353045.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值