社区讨论

求助!为什么过不了第二个样例?

P3601签到题参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lrkh8sfm
此快照首次捕获于
2024/01/19 18:07
2 年前
此快照最后确认于
2024/01/19 20:57
2 年前
查看原帖
甚至全都开了long long
CPP
#include <bits/stdc++.h>
using namespace std;
const long long MOD=666623333;
long long prime[1000010],t;
long long l,r,ans;
bool is_prime[1000010];
long long bigprime[1000010];
long long phi[1000010];
void oral_prime ()
{
	for (long long i=1;i<=1000000;i++)
		is_prime[i]=true;
	for (long long i=2;i<=1000000;i++) {
		if (is_prime[i]==true) prime[++t]=i;
		for (long long j=1;j<=t && prime[j]*i<=1000000;j++) {
			is_prime[i*prime[j]]=false;
			if (i%prime[j]==0) break;
		}
	}
}
int main()
{
	oral_prime();
	scanf("%lld%lld",&l,&r);
	for (long long i=l;i<=r;i++) {
		bigprime[i-l]=i;
		phi[i-l]=i;
	}
	for (long long i=1;i<=t;i++) {
		for (long long j=max(prime[i]*prime[i],((l%prime[i]==0)?l:(l/prime[i]*prime[i]+prime[i])));j<=r;j+=prime[i]) {
			phi[j-l]=(phi[j-l]/prime[i]*(prime[i]-1))%MOD;
			while (bigprime[j-l]%prime[i]==0) bigprime[j-l]/=prime[i];
		}
	}
	for (long long i=l;i<=r;i++)
		if (bigprime[i-l]!=1) phi[i-l]=(phi[i-l]/bigprime[i-l]*(bigprime[i-l]-1))%MOD;
	for (long long i=l;i<=r;i++) {
		ans=ans-phi[i-l]+i;
		ans%=MOD;
	}
	printf("%lld",ans%MOD);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...