P1447 [NOI2010] 能量采集 的代码

P1447 [NOI2010] 能量采集 的代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
#define int long long 
int n,m;
int N,ans;
bool vis[maxn+5];
int pr[maxn+5],prt;
int phi[maxn+5];
int sm[maxn+5];
inline void Init(){
	phi[1]=1;
	for(int i=2;i<=N;i++){
		if(!vis[i]){
			pr[++prt]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=prt&&i*pr[j]<=N;j++){
			vis[i*pr[j]]=1;
			if(i%pr[j]==0){
				phi[i*pr[j]]=phi[i]*pr[j];
				break;
			}
			else phi[i*pr[j]]=phi[i]*phi[pr[j]];
		}
	}
	for(int i=1;i<=N;i++) sm[i]=sm[i-1]+phi[i];
}
signed main(){
	scanf("%lld%lld",&n,&m);
	N=min(n,m);
	Init();
	for(int i=1,j;i<=N;i=j+1){
		j=min(n/(n/i),m/(m/i));
		ans+=(n/i)*(m/i)*(sm[j]-sm[i-1]);
	}
	printf("%lld",2*ans-n*m);
	return 0;
}
posted @ 2024-05-22 21:34  DeepSeaSpray  阅读(1)  评论(0编辑  收藏  举报