Description
Input
Output
Sample Input
3 1 50 500
Sample Output
0 1 15
Hint
From 1 to 500, the numbers that include the sub-sequence "49" are "49","149","249","349","449","490","491","492","493","494","495","496","497","498","499", so the answer is 15.
Analyse:
同 “不要62”,数位模板!!
但是脑残,,,,dp没开long long;
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#define INF 0x7fffffff
#define SUP 0x80000000
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef __int64 LL;
const int N=100007;
LL dp[30][10][2];
int digit[30];
LL dfs(int pos,int pre,int en,int limit)
{
if(pos==-1) return en;
if(!limit&&dp[pos][pre][en]!=-1) return dp[pos][pre][en];
int last=limit?digit[pos]:9;
LL ret=0;
for(int i=0;i<=last;i++)
{
ret+=dfs(pos-1,i,en||(pre==4&&i==9),limit&&i==last);
}
if(!limit) dp[pos][pre][en]=ret;
return ret;
}
LL solve(LL x)
{
int cnt=0;
while(x)
{
digit[cnt++]=x%10;
x/=10;
}
return dfs(cnt-1,0,0,1);
}
int main()
{
int T;scanf("%d",&T);
LL n;
mem(dp,-1);
while(T--)
{
scanf("%I64d",&n);
printf("%I64d\n",solve(n));
}
return 0;
}
原文:http://blog.csdn.net/code_or_code/article/details/45048681