60分求助
  • 板块P3601 签到题
  • 楼主Kreado
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/2/4 16:02
  • 上次更新2023/10/24 01:44:00
查看原帖
60分求助
590600
Kreado楼主2023/2/4 16:02
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=1e7+7,Mod=666623333;
ll l,r,ans;
bool isprime[Maxn];
int prime[Maxn/3],cnt,phi[Maxn],e[Maxn];
inline void Euler(ll N){
	isprime[1]=isprime[0]=1;
	for(ll i=2;i<=N;i++){
		if(!isprime[i]) prime[++cnt]=i;
		for(ll j=1;j<=cnt&&prime[j]*i<=N;j++){
			isprime[prime[j]*i]=1;
			if(!(i%prime[j])) break;
		}
	}
}
int main(){
	scanf("%lld%lld",&l,&r);
	Euler(Maxn-6);
	for(ll i=0;i<r-l+1;i++) phi[i]=i+l,e[i]=i+l;
	for(ll i=1;i<=cnt&&prime[i]*prime[i]<=r;i++)
		for(ll j=ceil(l*1.0/prime[i]);j<=r/prime[i];j++){
			phi[j*prime[i]-l]=phi[j*prime[i]-l]/prime[i]*(prime[i]-1);
 			while(e[j*prime[i]-l]%prime[i]==0) e[j*prime[i]-l]/=prime[i]; 
		}
	for(ll i=0;i<r-l+1;i++){
		if(e[i]!=1) phi[i]=phi[i]/e[i]*(e[i]-1);
		ans=(ans+(i+l-phi[i])%Mod)%Mod;
	}
	printf("%lld",ans);
	return 0;
}

2023/2/4 16:02
加载中...