P2303 [SDOI2012] Longge 的问题

Jennie

结合一下上一个题的思想,先确定一下这个最大公因数可以是谁--n的因数,

所以说肯定要对n的每一个因数的倍数下手,其中去除乘起来为n的哪个外,我们要注意一下剩下的倍数要跟他互质

‘这不就和上个题一样了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
using namespace std;
int prime[9000006];
int vis[9000005];
int sum[9000005];
int n;
int p;
void ini(){
	int nn=sqrt(n);
	for(int i=2;i<=nn;++i){
		if(!vis[i]){
			p++;
			prime[p]=i;
		}
		for(int j=1;j<=p&&i*prime[j]<=nn;j++){
			vis[i*prime[j]]=1;
			if(i%prime[j]==0){
				break;
			}
		}
	}
}
int ans;
int phi(int x){
	int tem=x;
	for(int i=1;i<=p&&prime[i]*prime[i]<=x;++i){
		if(x%prime[i]) continue;
		tem=tem/prime[i]*(prime[i]-1);
		while(x%prime[i]==0) x/=prime[i];
	}
	if(x>1) tem=tem/x*(x-1);
	return tem;
}
signed main(){
	scanf("%d",&n);
	ini();
	for(int i=1;i*i<=n;++i){
		if(n%i==0){
			if(i*i!=n)
			ans+=i*phi(n/i)+(n/i)*phi(i);
			else
			ans+=i*phi(i);
		}		
	}
	cout<<ans;
	return 0;
}
posted @ 2021-07-30 00:14  Simex  阅读(24)  评论(0编辑  收藏  举报