作者:美竹 | 来源:互联网 | 2024-10-09 10:54
Description定义一个数字为幸运数字当且仅当它的所有数位都是444或者777。比如说,47、744、447、744、447、744、4都是幸运数字而5、17、4675、17
Description
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,47、744、4都是幸运数字而5、17、467都不是。
定义next(x)为大于等于x的第一个幸运数字。给定l,r,请求出i=l∑rnext(i)。
Input
两个整数l和r$ (1\le l\le r \le 10^9)$
Output
一个数字表示答案。
Sample Input
2 7
Sample Output
33
Solution
找到所有的幸运数字分段计算即可
Code
#include
#include
using namespace std;
typedef long long ll;
const int maxn=100001;
ll f[maxn];
ll Solve(int n)
{
ll ans=0;
for(int i=1;;i++)
{
ans+=(min(f[i],(ll)n)-f[i-1])*f[i];
if(f[i]>=n)return ans;
}
}
int main()
{
f[1]=4,f[2]=7;
int pre=1;
for(int i=3;;)
{
int k=i-1;
for(int j=pre;j<=k;j++)f[i++]=f[j]*10+4;
for(int j=pre;j<=k;j++)f[i++]=f[j]*10+7;
if(f[i-1]>1e9)
{
sort(f+1,f+i);
break;
}
pre=k+1;
}
int l,r;
while(~scanf("%d%d",&l,&r))printf("%lld\n",Solve(r)-Solve(l-1));
return 0;
}