求助简单题
  • 板块P6055 [RC-02] GCD
  • 楼主Kreado
  • 当前回复13
  • 已保存回复13
  • 发布时间2023/2/22 20:24
  • 上次更新2023/10/24 00:05:11
查看原帖
求助简单题
590600
Kreado楼主2023/2/22 20:24

CODe

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=1e7+7,Mod=998244353;
ll prime[Maxn],cnt,mu[Maxn];
bool isprime[Maxn];
inline void EulerSieve(ll N){
	isprime[1]=isprime[0]=1;mu[1]=1;
	for(ll i=2;i<=N;i++){
		if(!isprime[i]) prime[++cnt]=i,mu[i]=-1;
		for(ll j=1;j<=cnt&&prime[j]*i<=N;j++){
			isprime[prime[j]*i]=1;
			if(!(i%prime[j])) break;
			mu[i*prime[j]]=-mu[i];
		}
	}
	for(ll i=1;i<=N;i++) mu[i]+=mu[i-1];
}
map<ll,ll>Mu;
inline ll Getmu(ll x){
	if(x<=Maxn-7) return mu[x];
	if(Mu[x]) return Mu[x];
	ll ans=1;
	for(ll l=2,r;l<=x;l=r+1){
		r=x/(x/l);
		ans-=(r-l+1)*Getmu(x/l);
	}
	return Mu[x]=ans;
}
inline void solve(ll N){
	ll ans=0;
	for(ll l=1,r;l<=N;l=r+1){
		r=N/(N/l);
		ans+=(r-l+1)%Mod*(Getmu(r)-Getmu(l-1))%Mod*(N/l)%Mod*(N/l)%Mod*(N/l)%Mod;
		ans=(ans%Mod+Mod)%Mod;
	}
	printf("%lld",ans);
}
int main(){
	ll p;
	EulerSieve(Maxn-7);
	scanf("%lld",&p);
	solve(p);	
	return 0;
}

2023/2/22 20:24
加载中...