hdu3555 Bomb

来源:互联网 发布:php接收安卓上传图片 编辑:程序博客网 时间:2024/06/03 20:22

The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "49", the power of the blast would add one point. 
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them? 
Input
The first line of input consists of an integer T (1 <= T <= 10000), indicating the number of test cases. For each test case, there will be an integer N (1 <= N <= 2^63-1) as the description. 

The input terminates by end of file marker. 
Output
For each test case, output an integer indicating the final points of the power.
Sample Input
3150500
Sample Output
0115

思路:想一下补集,我们求出不包含49的数的个数,然后一减就可以了。

注意:

求补集的时候0也会算上,会多减一个,所以最后不要忘记加1。

#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN=1e5+10;LL l,r;LL dp[25][10];int digit[20];LL dfs(int len,int num,int up){    if(!len)return 1;    if(!up && dp[len][num] != -1)return dp[len][num];    LL res = 0;    int n = up?digit[len] : 9;    for(int i = 0 ; i <= n ; ++i)    {        if(num == 4 && i == 9)continue;        res += dfs(len - 1,i,up && i==n);    }    if(!up)dp[len][num] = res;    return res;}LL cal(LL x){    int len = 0;    LL temp = x;    while(x)    {        digit[++len] = x%10;        x /=10 ;    }    return temp-dfs(len,0,1)+1;}int main(){    memset(dp,-1,sizeof dp);    int t;    scanf("%d",&t);    while(t--)    {        scanf("%I64d",&r);        printf("%I64d\n",cal(r));    }    return 0;}






原创粉丝点击