题目传送门:https://www.luogu.org/problemnew/show/P3601
题意:
给一个l,r,求。
保证r-l<=10^6。
思路:
特别强。
用一下欧拉筛算出1~10^6的欧拉函数,再用这种思想算出l~r的欧拉函数即可。
代码:
#include<cstdio>
#include<algorithm>
#define LL long long
#define mod 666623333
#define _ 1000010
using namespace std;
LL prime[_],phi[_],a[_];
bool bz[_];
int n,q,t=0;
LL l,r,ans=0;
void init(int ma)
{
bz[0]=bz[1]=true;
for(int i=2;i<=ma;i++)
{
if(!bz[i]) prime[++t]=i;
for(int j=1;j<=t&&i*prime[j]<=ma;j++)
{
bz[i*prime[j]]=true;
if(!(i%prime[j])) break;
}
}
}
void work()
{
for(int i=1;i<=t;i++)
{
LL p=prime[i];
for(int j=(p-l%p)%p;j<=r-l;j+=p)
{
phi[j]=phi[j]/p*(p-1);
while(!(a[j]%p)) a[j]/=p;
}
}
}
int main()
{
init(_);
scanf("%lld %lld",&l,&r);
for(LL i=l;i<=r;i++)
phi[i-l]=i,a[i-l]=i;
work();
for(int i=0;i<=r-l;i++)
{
if(a[i]!=1) phi[i]=phi[i]/a[i]*(a[i]-1);
ans=(ans+l+i-phi[i])%mod;
}
printf("%lld",ans);
}