作者:美竹 | 来源:互联网 | 2024-10-09 10:54
Description定义一个数字为幸运数字当且仅当它的所有数位都是444或者777。比如说,47、744、447、744、447、744、4都是幸运数字而5、17、4675、17
Description
定义一个数字为幸运数字当且仅当它的所有数位都是4 4 4或者7 7 7。
比如说,47 、 744 、 4 47、744、4 47、744、4都是幸运数字而5 、 17 、 467 5、17、467 5、17、467都不是。
定义n e x t ( x ) next(x) next(x)为大于等于x x x的第一个幸运数字。给定l , r l,r l,r,请求出∑ i = l r n e x t ( i ) \sum\limits_{i=l}^rnext(i) i=l∑rnext(i)。
Input
两个整数l l l和r r 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; }