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

hdu3555 数位dp

时间:2017-08-23 14:49:55      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:eof   opened   cst   --   color   ace   str   play   set   

题意:求1到n的数中含49的有多少个

和上一题类似,但是这题如果直接算含49的会有一点问题,所以先算不含49的然后用n-就好了,注意求1到n算的是n+1的

还有就是这题有毒,必须要用__int64而不能用long long

技术分享
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-7;
const int N=20+10,maxn=1000000+10,inf=0x3f3f3f;

__int64 f[N][N];
void init()
{
    memset(f,0,sizeof f);
    f[0][0]=1;
    for(int i=1;i<=20;i++)
        for(int j=0;j<=9;j++)
            for(int k=0;k<=9;k++)
            {
                if(j==4&&k==9)continue;
                f[i][j]+=f[i-1][k];
            }
}
__int64 getnum(__int64 x)
{
    __int64 ans=0,len=0,digit[30];
    while(x)
    {
        digit[++len]=x%10;
        x/=10;
    }
    for(int i=len;i>=1;i--)
    {
        for(int j=0;j<digit[i];j++)
            if(j!=9||digit[i+1]!=4)
               ans+=f[i][j];
        if(digit[i]==9&&digit[i+1]==4)break;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    init();
    int t;
    cin>>t;
    while(t--)
    {
        __int64 n;
        cin>>n;
        cout<<n+1-getnum(n+1)<<endl;
    }
    return 0;
}
/********************

********************/
View Code

 

hdu3555 数位dp

标签:eof   opened   cst   --   color   ace   str   play   set   

原文地址:http://www.cnblogs.com/acjiumeng/p/7417692.html

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