简述
真没啥好说的,随便无脑化最后就出来了
ans=12∑d=1n⌊nd⌋dφ(d)+n2
代码
//杜教筛
#include <cstdio>
#include <algorithm>
#define maxn 4700000
#define mod 1000000007ll
using namespace std;
typedef long long ll;
ll N, phi[maxn+10], f[maxn+10], _2, _6;
int prime[maxn+10];
bool mark[maxn+10];
void m(ll &x){if(x>mod or x<-mod)x%=mod;}
ll sqr(ll x){m(x);return x*x%mod;}
ll s1(ll x){m(x);return x*(1+x)%mod*_2%mod;}
ll s2(ll x){m(x);return x*(1+x)%mod*(2*x+1)%mod*_6%mod;}
void shai()
{
ll i, j;
phi[1]=1;
for(i=2;i<maxn;i++)
{
if(!mark[i])prime[++*prime]=i, phi[i]=i-1;
for(j=1;i*prime[j]<maxn;j++)
{
mark[i*prime[j]]=1;
if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for(i=1;i<maxn;i++)phi[i]=(phi[i-1]+phi[i]*i)%mod;
}
ll getf(ll n){return n<maxn?phi[n]:f[N/n];}
void djs(ll n)
{
if(n<maxn or getf(n))return;
ll i, last, t=N/n;
f[t]=s2(n);
for(i=2;i<=n;i=last+1)
{
last=n/(n/i);
djs(n/i);
f[t]=(f[t]-(s1(last)-s1(i-1))*getf(n/i))%mod;
}
}
ll calc(ll n)
{
ll i, last, ans=0;
for(i=1;i<maxn;i++)f[i]=0;
djs(N=n);
for(i=1;i<=N;i=last+1)
{
last=N/(N/i);
ans=(ans+(N/i)*(getf(last)-getf(i-1)))%mod;
}
return ans=(ans+N)*_2%mod;
}
int main()
{
ll a, b;
shai();
_2=500000004;
_6=166666668;
scanf("%lld%lld",&a,&b);
a=calc(a-1), b=calc(b);
printf("%lld",((b-a)%mod+mod)%mod);
return 0;
}