51nod1227 平均最小公倍数

简述

  真没啥好说的,随便无脑化最后就出来了
  

ans=12d=1nnddφ(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;
}

猜你喜欢

转载自blog.csdn.net/fsahfgsadhsakndas/article/details/71841864
今日推荐