Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 50 Accepted Submission(s) : 30
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
有人发现了一枚定时炸弹!
反恐专家杨逸舟奉命赶到现场紧急处理。
经过分析,杨逸舟发现,这次恐怖分子改进了定时炸弹——定时炸弹的数字序列从1到N计数,如果当前数字序列包含子序列“49”,炸弹的威力就将增加一个点。
现在,已知数字N,反恐专家杨逸舟想知道炸弹最终的威力是多少。
Input
每组数据包含一个整数N (1 <= N <= 2^63-1),其含义如题目描述。
Output
Sample Input
3 1 50 500
Sample Output
0 1 15
Hint
using namespace std;
long long dp[25][3];
long long bin[25];
long long balala(long long n)
{
long long len=0;
while(n)
{
bin[++len]=n%10;
n/=10;
}
bin[len+1]=0;
bool flag=false;
long long ans=0;
for(long long i=len;i>=1;i--)
{
ans+=dp[i-1][2]*bin[i];
if(flag)
{
ans+=dp[i-1][0]*bin[i];
}
else
{
if(bin[i]>4)
ans+=dp[i-1][1];
}
if(bin[i+1]==4&&bin[i]==9)
{
flag=true;
}
}
if(flag)
{
ans++;
}
return ans;
}
int main()
{
dp[0][0]=1;
dp[0][1]=0;
dp[0][2]=0;
long long m,n;
cin>>n;
for(int i=1;i<21;i++)
{
dp[i][0]=10*dp[i-1][0]-dp[i-1][1];//前面不行的减去9前加4的
dp[i][1]=dp[i-1][0];//前面不行前面加9
dp[i][2]=dp[i-1][2]*10+dp[i-1][1];//前面可以的随便加还有9前加4的
// printf("%lld %lld %lld\n",dp[i][0],dp[i][1],dp[i][2]);
}
while(n--)
{
cin>>m;
cout<<balala(m)<<endl;
}