hdu 3555 统计包含49的数字
2013-05-06 22:22
274 查看
dp[i][3],其中i表示位数,后面的3表示有三种数 0:首位不带9的合法数 1:首位带9的合法数 2:不合法数
View Code
View Code
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> typedef long long LL; int const N = 20; LL dp [3],n,pow10[20];//0合法的数字个数 1以9开头的合法数字 2不合法的数字 int bit ,t; void pre() { dp[0][0]=1,dp[0][1]=0,dp[0][2]=0; dp[1][0]=9,dp[1][1]=1,dp[1][2]=0; for(int i=2;i<=19;i++) { dp[i][0]=dp[i-1][0]*9+dp[i-1][1]*8;//i-1位不以9开头数字前可添加9种数字 i-1位以9开头数字前可添加8种数字 dp[i][1]=dp[i-1][0]+dp[i-1][1];//i-1位不以9开发数字前添加9 i-1位以9开头数字前添加9 dp[i][2]=dp[i-1][2]*10+dp[i-1][1];//i-1位不合法数字前可添加10种数字 i-1位以9开头数字前添加4构成不合法数 } } LL getsum(LL z) { LL ans=z; t=0; for(;ans;ans/=10)bit[++t]=ans%10; int flag=0,pre=0; while(t) { ans+=dp[t-1][2]*bit[t]; if(flag) { ans+=(dp[t-1][0]+dp[t-1][1])*bit[t]; } else { if(bit[t]>4) ans+=dp[t-1][1]; } if(pre==4&&bit[t]==9) flag=1; pre=bit[t]; t--; } return ans; } int main() { int T; pre(); scanf("%d",&T); while(T--) { scanf("%I64d",&n); printf("%I64d\n",getsum(n+1));//由于getsum(n)只能算出n-1中不合法的个数,所以要+1 } return 0; }
相关文章推荐
- (数位DP 1.2)hdu 3555 Bomb(统计1~n中,包含49的数的个数)
- HDU 3555 Bomb(1-n含有“49”的数字个数)
- [ACM] hdu 3555 Bomb (数位DP,统计1-N中含有“49”的总数)
- 华为OJ——输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
- C统计1-49的数字出现的次数
- HDU 2089 数位dp水题 统计区间中不包含62 和 4 的个数
- 【华为OJ】输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
- hdu 3555 含有49的数 数位dp
- hdu 3555 Bomb(不要49,数位DP)
- 已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
- mysql 统计包含数字和分隔符的字符串,数字有几个
- 华为OJ 初级:输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
- HDU 1735 统计数字(贪心)
- 输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数-简单题
- 华为OJ试题:输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
- 数位DP——HDU 3555 要49
- C#做个记事本(包含数字,汉字统计)
- bit-map程序(解决已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数)
- 求(1~n)中有多少个数字包含49数字
- hdu(3555)——Bomb(不要49)