http://acm.hdu.edu.cn/showproblem.php?pid=2089
#include<iostream>
#include<cstring>
using namespace std;
int dp[10][15];
void getdp()
{
int i,j,k;
dp[0][0]=1;
for(i=1;i<=7;i++)
{
for(j=0;j<=9;j++) { if(j==4) dp[i][j]=0;
else if(j==6)
{
for(k=0;k<=9;k++)
{
dp[i][j]+=dp[i-1][k];
}
dp[i][j]-=dp[i-1][2];
}
else
{
for(k=0;k<=9;k++)
{
dp[i][j]+=dp[i-1][k];
}
}
}
}
}
int a[10];
int solve(int n)
{
int i,j,ans=0;
a[0]=0;
while(n)
{
a[++a[0]]=n%10;
n=n/10;
}
a[a[0]+1]=0;
for(i=a[0];i>=1;i--)
{
for(j=0;j<a[i];j++)
{
if(j!=4&&!(a[i+1]==6&&j==2))
ans+=dp[i][j];
}
if(a[i]==4)
break;
if(a[i+1]==6&&a[i]==2)
break;
}
return ans;
}
int main()
{
int n,m;
memset(dp,0,sizeof(dp));
getdp();
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
int k1=solve(n);
int k2=solve(m+1);
cout<<k2-k1<<endl;
}
return 0;
}
http://acm.hdu.edu.cn/showproblem.php?pid=3555
参考 博客
https://blog.csdn.net/qq_34374664/article/details/52917231
#include<iostream>
#include<cstring>
using namespace std;
long long dp[21][3];
int bit[21];
//dp[i][0]表示长度为i不含49的个数
//dp[i][1]表示长度为i不含49且最高为为9的个数
//dp[i][2]表示长度为i含49的个数
void init()
{
dp[0][0]=1;
dp[0][1]=0;
dp[0][2]=0;
for(int i=1;i<=21;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];
}
}
long long cal(long long n)
{
int len=0;
long long ans=0;
while(n)
{
bit[++len]=n%10;
n=n/10;
}
bit[len+1]=0;
bool has=false;
for(int i=len;i>=1;i--)
{
ans+=dp[i-1][2]*bit[i];
if(!has)
{
if(bit[i]>4)
{
ans+=dp[i-1][1];
}
}
else
ans+=(dp[i-1][0])*bit[i];
if(bit[i+1]==4&&bit[i]==9)
has=true;
}
if(has)
ans++;
return ans;
}
int main()
{
init();
int t;
cin>>t;
while(t--)
{
long long n;
cin>>n;
cout<<cal(n)<<endl;
}
return 0;
}