之前航电有道不要62.这个是幸运数字.那么我们可以进行打表处理.打表用个dfs就好了.
(1 <= l <= r <= 1000,000,000)说句实话..可能是数据水了.为啥那种r-l的算法能过..
先贴一下r-l算法的代码:
#include<bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define pb push_back #define inf 132913423039 typedef long long ll; const ll mod=1e9+7; const ll N=5e5+5; const ll M=2e4+5; const double eps=1e-7; using namespace std; ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b);} ll lcm(ll a,ll b) { return a*b/gcd(a,b); } ll qp(ll a,ll b, ll p){ll ans = 1;while(b){if(b&1){ans = (ans*a)%p;--b;}a = (a*a)%p;b >>= 1;}return ans%p;} ll Inv(ll x) { return qp(x,mod-2,mod);} ll C(ll n,ll m){if (m>n) return 0;ll ans = 1;for (int i = 1; i <= m; ++i) ans=ans*Inv(i)%mod*(n-i+1)%mod;return ans%mod;} ll A(ll n,ll m,ll mod){ll sum=1; for(int i=n;i>=n-m+1;i--) sum=(sum*i)%mod; return sum%mod;} ll lowbit(ll x) {return x&(-x);} ll c[N],sum1[N],sum2[N],a[N],lsh[N],n,m; void add1(ll i,ll k){ while(i<=n) {c[i]+=k;i+=lowbit(i);}}//预处理ai单点修改 区间查询***预处理a[i]-a[i-1]区间修改单点查询 ll Sum1(ll i) {ll res=0; while(i>0) res+=c[i],i-=lowbit(i);return res;}//预处理ai单点修改 区间查询***预处理a[i]-a[i-1]区间修改单点查询 void add2(ll i,ll k){ ll x=i;while(i<=n) {sum1[i]+=k;sum2[i]+=k*(x-1);i+=lowbit(i);}}//区间修改,区间查询 ll Sum2(ll i) {ll res=0,x=i;while(i>0){ res+= x * sum1[i]-sum2[i]; i -= lowbit(i);}return res;}//区间修改,区间查询 void ls(){ll cnt; for(ll i=1;i<=n;i++) lsh[i]=a[i]; sort(lsh+1,lsh+n+1);cnt = unique(lsh+1,lsh+n+1)-lsh-1; for(int i=1;i<=n;i++)a[i]=lower_bound(lsh+1,lsh+cnt+1,a[i])-lsh;} ll k[(1<<11)+5],g=0; void dfs(ll x) { if(x>=4444444444) return; k[g++]=x*10+4;k[g++]=x*10+7;dfs(x*10+4);dfs(x*10+7);} int main() { //打个1<<9的表就好了 ios; ll l,r,j,ans=0,pos=0; cin>>l>>r; dfs(0); sort(k,k+g); for(ll i=l;i<=r;i++) { for(j=pos;k[j]<i;j++); pos=j,ans+=k[j]; } cout<<ans<<endl; return 0; }
下面在给大家贴下优化一点的代码,因为不喜欢用scanf..所以..你可以用scanf再试试代码的运行速度.
#include<bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define pb push_back #define inf 132913423039 typedef long long ll; const ll mod=1e9+7; const ll N=5e5+5; const ll M=2e4+5; const double eps=1e-7; using namespace std; ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b);} ll lcm(ll a,ll b) { return a*b/gcd(a,b); } ll qp(ll a,ll b, ll p){ll ans = 1;while(b){if(b&1){ans = (ans*a)%p;--b;}a = (a*a)%p;b >>= 1;}return ans%p;} ll Inv(ll x) { return qp(x,mod-2,mod);} ll C(ll n,ll m){if (m>n) return 0;ll ans = 1;for (int i = 1; i <= m; ++i) ans=ans*Inv(i)%mod*(n-i+1)%mod;return ans%mod;} ll A(ll n,ll m,ll mod){ll sum=1; for(int i=n;i>=n-m+1;i--) sum=(sum*i)%mod; return sum%mod;} ll lowbit(ll x) {return x&(-x);} ll c[N],sum1[N],sum2[N],a[N],lsh[N],n,m; void add1(ll i,ll k){ while(i<=n) {c[i]+=k;i+=lowbit(i);}}//预处理ai单点修改 区间查询***预处理a[i]-a[i-1]区间修改单点查询 ll Sum1(ll i) {ll res=0; while(i>0) res+=c[i],i-=lowbit(i);return res;}//预处理ai单点修改 区间查询***预处理a[i]-a[i-1]区间修改单点查询 void add2(ll i,ll k){ ll x=i;while(i<=n) {sum1[i]+=k;sum2[i]+=k*(x-1);i+=lowbit(i);}}//区间修改,区间查询 ll Sum2(ll i) {ll res=0,x=i;while(i>0){ res+= x * sum1[i]-sum2[i]; i -= lowbit(i);}return res;}//区间修改,区间查询 void ls(){ll cnt; for(ll i=1;i<=n;i++) lsh[i]=a[i]; sort(lsh+1,lsh+n+1);cnt = unique(lsh+1,lsh+n+1)-lsh-1; for(int i=1;i<=n;i++)a[i]=lower_bound(lsh+1,lsh+cnt+1,a[i])-lsh;} ll k[(1<<11)+5],g=0; void dfs(ll x) { if(x>=4444444444) return; k[g++]=x*10+4;k[g++]=x*10+7;dfs(x*10+4);dfs(x*10+7);} int main() { //打个1<<9的表就好了 ios; ll l,r,j,ans=0,pos=0; cin>>l>>r; dfs(0); sort(k,k+g); for(ll i=l;i<=r;i++) { for(j=pos;k[j]<i;j++); pos=j,ans+=(min(k[j],r)-i+1)*k[j];i=k[j]; } cout<<ans<<endl; return 0; }
数据太水了,起码卡下吧