60分求助
  • 板块P3601 签到题
  • 楼主PpxYm2011
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/4/20 17:08
  • 上次更新2023/10/28 03:15:12
查看原帖
60分求助
581663
PpxYm2011楼主2022/4/20 17:08
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
    char ch=getchar();int x=0,f=1;
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} 
	while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 
	return x*f;
}
const int N=1e6+5;
const ll mod=666623333;
ll v[N],prime[N];
int quickpow(int a,int b){
	int cnt=1;
	while(b){
		if(b%2==1)cnt=(1ll*cnt*a)%mod;
		a=(1ll*a*a)%mod;
		b/=2;
	}
	return cnt;
}
vector<ll>q[N];
int main(){  
	ll l,r;cin>>l>>r;int m=0;
	for(ll i=2;i<=1000000;++i){
		if(!v[i]){
			v[i]=i;
			prime[++m]=i;
		}
		for(int j=1;j<=m;++j){
			if(prime[j]>v[i]||1ll*prime[j]*i>1000000)break;
			v[i*prime[j]]=prime[j];
		}
	}
	for(int i=1;i<=m;++i){
		for(ll j=l/prime[i];j<=r/prime[i];++j){
			if(j*prime[i]-l>=0)q[j*prime[i]-l].push_back(prime[i]);
		}
	}
	ll ans=0;
	for(ll i=l;i<=r;++i){
		ll now=i,phi=i;
		for(int j=0;j<q[i-l].size();++j){
			while(now%q[i-l][j]==0)now/=q[i-l][j];
			phi=(1ll*(1ll*(q[i-l][j]-1)*phi%mod)*quickpow(q[i-l][j],mod-2))%mod;
		}
		if(now>1)phi=(1ll*(1ll*(now-1)*phi%mod)*quickpow(now,mod-2))%mod;
		ans=(ans+(i-phi)%mod)%mod;
	} 
	cout<<ans<<endl;
	return 0;
} 

四个WA的点就是数据最大的四个点,但是既然6个点能对,应该算法思路是没错的,难道是哪里没long long吗

2022/4/20 17:08
加载中...