3 1 50 500
0 1 15
题意:计算一个数内含连续数49的个数
思路
:和上一篇博客题意相近,同理可解,数据很大,要用__int64
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
typedef __int64 ll;
#define fre(i,a,b) for(i = a; i < b; i++)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d%d", &a, &b)
#define sfff(a,b,c) scanf("%d%d%d", &a, &b, &c)
#define pf printf
#define bug pf("Hi\n")
using namespace std;
#define INF 0x3f3f3f3f
#define N 22
ll dp[N][3];
//dp[i][0] 没有不吉利
//dp[i][1] 没有不吉利 首位 为 9
//dp[i][2] 有不吉利
void inint()
{
dp[0][0]=1;
ll i;
for(i=1;i<N;i++)
{
dp[i][0]=dp[i-1][0]*10-dp[i-1][1];
dp[i][1]=dp[i-1][0];
dp[i][2]=dp[i-1][2]*10+dp[i-1][1];
}
}
void solve(ll x)
{
ll i,len=0,bit[N];
while(x)
{
bit[++len]=x%10;
x=x/10;
}
bit[len+1]=0;
ll ans=0;
bool flag=false;
for(i=len;i>=1;i--)
{
ans+=bit[i]*dp[i-1][2];
if(flag)
ans+=bit[i]*dp[i-1][0];
if(flag) continue;
if(bit[i]>4)
ans+=dp[i-1][1];
if(bit[i+1]==4&&bit[i]==9)
flag=true;
}
printf("%I64d\n",ans);
}
int main()
{
int t;
ll le;
inint();
sf(t);
while(t--)
{
scanf("%I64d",&le) ;
solve(le+1);
}
return 0;
}
原文:http://blog.csdn.net/u014737310/article/details/44102215