The main solution of this problem is to divide and sum the lucknumber in 1~100000000;
For example, lucksum[0] = sum[1,4] lucksum[1] = sum[5,7] lucksum[2] = sum[8,44] ........ .....
Then the sum is summed according to the interval span of l,r;
The interval is obtained by an int findunder (int l);
#include <iostream>#include<cstring>#include<cmath>#include<queue>#include<algorithm>using namespaceStd;typedefLong Longll;Const intMAXN =1e9;ll lucknumber[ the][2];ll lucksum[ the];voidinit () {intCnt=2; Long Longnum; Queue<Long Long>que; lucknumber[0][0]=1; lucknumber[0][1]=4; lucknumber[1][0]=5; lucknumber[1][1]=7; Que.push (4); Que.push (7); while(!Que.empty ()) {num=Que.front (); Que.pop (); if(num*Ten+4<=MAXN) lucknumber[cnt][0] = lucknumber[cnt-1][1]+1, lucknumber[cnt++][1] = num*Ten+4, Que.push (num*Ten+4); Else Break; if(num*Ten+7<=MAXN) lucknumber[cnt][0] = lucknumber[cnt-1][1]+1, lucknumber[cnt++][1] = num*Ten+7, Que.push (num*Ten+7); Else Break; } lucknumber[cnt][0]=lucknumber[cnt-1][1]+1; lucknumber[cnt][1]=4444444444; for(intI=0; i<cnt;i++) {Lucksum[i]= (lucknumber[i][1]-lucknumber[i][0]+1) *lucknumber[i][1]; //cout<<lucksum[i]<<endl; } //cout<<cnt<<endl; }intFindunder (intl) { for(intI=0; i<=1022; i++){ if(l<=lucknumber[i][1]&&l>=lucknumber[i][0])returni; } }intMain () {init (); intl,r,lsize,rsize; ll sum; scanf ("%d%d",&l,&S); Lsize=Findunder (L); Rsize=Findunder (R); Sum=0; Sum= (min (lucknumber[lsize][1], (LL) R)-l+1) *lucknumber[lsize][1]; for(intI=lsize+1; i<rsize;i++) sum+=Lucksum[i]; if(lsize!=rsize) {Sum+ = (r-lucknumber[rsize][0]+1) *lucknumber[rsize][1]; } printf ("%i64d\n", sum); return 0;}
CNT can know that each cycle needs 2^9 times at most, and at most only 5 layers of circulation, O (5*2^9);
Codeforces Beta Round #91 (Div. 1 only) A. Lucksum (interval block solver)