求助
  • 板块P3601 签到题
  • 楼主Liangjm
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/3/28 11:15
  • 上次更新2023/11/5 01:27:29
查看原帖
求助
263846
Liangjm楼主2021/3/28 11:15
#include<bits/stdc++.h>
using namespace std;

#define LL long long
#define rep0(i,n) for(register int i=0;i<n;i++)
#define rep1(i,n) for(register int i=1;i<=n;i++)
#define rep(i,j,n) for(register int i=9;i<n;i++)

const int N=1e6+5;
LL pri[N],cnt,phi[N],A[N],ans;
bool vis[N];

const int MOD=666623333;
void prime(){
	for(int i=2;i<=N-10;i++){
		if(!vis[i])
			pri[cnt++]=i;
		for(int j=1;j<=cnt && i*pri[j]<=N-10;j++){
			vis[pri[j]*i]=1;
			if(!(i%pri[j]))
				break;
		}
	}
}

int main()
{
	LL l,r;
	prime();
	scanf("%lld%lld",&l,&r);
	for(LL i=l;i<=r;i++){
		phi[i-l]=i;
		A[i-l]=i;
	}
	for(int i=1;i<=cnt && pri[i]*pri[i]<=r;i++){
		LL pr=pri[i];
		int start=l;
		if(l%pr)
			start=l/pr*pr+pr;
			for(LL j=start;j<=r;j+=pr){
				phi[j-l]=phi[j-l]/pr*(pr-1);
				while(A[j-1]%pr==0)
					A[j-1]/=pr;
			}
	}
	for(LL i=l;i<=r;i++){
		if(A[i-l]>1)
			phi[i-l]/A[i-l]*(A[i-l]-1);
		ans=(ans+(i-phi[i-1])%MOD)%MOD;
	}
	printf("%lld\n",ans);
	return 0;
}


2021/3/28 11:15
加载中...