您的位置:首页 > 其它

hdu 3555 统计包含49的数字

2013-05-06 22:22 274 查看
dp[i][3],其中i表示位数,后面的3表示有三种数 0:首位不带9的合法数 1:首位带9的合法数 2:不合法数

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: