您的位置:首页 > 其它

【数位DP】 HDU 3555 Bomb

2014-12-08 22:49 351 查看
点击打开链接

求0-N之内 存在49的个数

先是统计了0-2^63内所有没有49的个数

n-getans(n+1)+1;

getans(n+1)统计的是 0-n内的个数

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <deque>
#include <map>
#define cler(arr, val)    memset(arr, val, sizeof(arr))
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long  LL;
const int MAXN = 102020;
const int MAXM = 240000;
const int INF = 0x3f3f3f3f;
const int mod = 1000000007;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
LL dp[20][10];
void init()
{
cler(dp,0);
dp[0][0]=(LL)1;
for(int i=1;i<=18;i++)
for(int j=0;j<=9;j++)// j表示当前位,k表示j之前一位
for(int k=0;k<=9;k++)
{
if((j==4&&k==9)) continue;//出现49
dp[i][j]+=dp[i-1][k];
}
}
LL getans(LL n)
{
LL ans=0;
int digit[20],len=0;
cler(digit,0);
while(n)
{
digit[++len]=n%10;
n/=10;
}
for(int i=len;i>=1;i--)
{
for(int j=0;j<digit[i];j++)//统计0 - digit[i]-1 上的个数,下一个i表示digit[i+1]上所有的数
{
if(j==9&&digit[i+1]==4)
continue;
ans+=dp[i][j];
}
if(digit[i]==9&&digit[i+1]==4)//出现了49接下来的数都不是了
break;
}
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);
#endif
LL n,t;
cin>>t;
init();
while(t--)
{
cin>>n;
printf("%I64d\n",n-getans(n+1)+1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: