数位dp-6的个数
eoj3257
输入l,r,输出l-r间所有数字的‘6’的个数。(输入有多组)
其实就是一道简单的数位dp,可以预处理dp,避免多算。
但卡unsigned long long,好气。
贴代码:
#include<iostream>
#include<cstdio>
typedef unsigned long long ll;
using namespace std;
ll dp1[29]={},dp[29]={};
ll count(ll x,int nu){ //nu是要问的数字,比如在这里是6
ll ans(0),i(0),j(0),ra=x,tail(0);
while(x){
j=x%10,x/=10;
++i;
if(j>nu) ans+=dp[i];
else if(j==nu) ans+=tail+1;
ans+=j*dp1[i-1];
tail+=j*dp[i];
}
i=1;
if(!nu)
while(ra) ans-=dp[i],ra/=10,i++;
return ans;
}
int main(){
ll l,r;
int j,i,k;
dp[1]=1;
dp1[1]=1;
for(i=2;i<=28;i++) dp[i]=dp[i-1]*10,dp1[i]=i*dp[i]; //i位整数有的6的个数
while(cin>>l>>r){
cout<<count(r,6)-count(l-1,6)<<endl;
}
return 0;
}
作者:凤涅
本文版权归作者所有,遵循CC-BY-4.0协议,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.