hdu2588题意 转 欧拉函数(模板)

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
//求n的欧拉函数值 
ll oula(int n){
	ll ans=n;//n=1是 ans为1 
	//因为只和因子有关,所以只需看根号n内的就行
	for(int i=2;i*i<=n;i++){
		if(n%i==0){//找到n的因子 
			ans=ans-ans/i;//欧拉函数的公式(实质是减去因子i相关的数) 
			while(n%i==0) n/=i;//去除n里所有的因子i。保证了i是质数
			//比如4=2*2,而所有2因子都被除去后,4不在是n的因子 
		}
	}
	if(n>1) ans=ans-ans/n;//因为n可能还没处理完,所有还要再用一遍欧拉公式。
	//注意n再while处理下一直在变,所以最后留下来的n即是最后一个质因子  
	return ans;
} 
ll  f(int n,int m){
	ll ans=0;
	for(int i=1;i*i<=n;i++){
		if(n%i) continue;//只看因子 
		//因为只和因子有关,所以只需看根号n内的就行,,对称可以通过i和n/i来看 
		if(i>=m&&i*i!=n) ans+=oula(n/i); 
		//i为 gcd 。i*i!=n 是防止重复算 
		if(n/i>=m) ans+=oula(i);
	}
	return ans;
}

int main(){
	int t,n,m;
	cin>>t;
	while(t--){
		scanf("%d%d",&n,&m);
		cout<<f(n,m)<<endl;
	}     
    return 0;
}

思路(copy) 

猜你喜欢

转载自blog.csdn.net/weixin_50904510/article/details/119843558