基础数位dp 跟那个4 62差不多 这个能更简单点 慢慢来吧= 。= 预处理好49连续的情况即可
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
#define sc "%I64d"
using namespace std;
ll dp[20][3];
/*
dp[0] 无连续49
dp[1] 无连续49高位为9
dp[2] 有连续49
*/
void Init()
{
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
int i;
for(i = 1; i <= 19; ++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];
}
}
ll Solve(ll n)
{
int len = 0,bit[21],i,f = false;
ll ans = 0;
while(n)
{
bit[++len] = n%10;
n /= 10;
}
bit[len+1] = 0;
for(i = len; i; --i)
{
ans += dp[i-1][2]*bit[i];
if(f) ans += dp[i-1][0]*bit[i];
if(!f && bit[i] > 4) ans += dp[i-1][1];
if(bit[i+1] == 4 && bit[i] == 9) f = true;
}
return ans;
}
int main()
{
int t;
ll n;
scanf("%d",&t);
Init();
while(t--)
{
scanf(sc,&n);
printf(sc,Solve(n+1));
puts("");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-15 06:57:57