UVA 10214木の樹木(オイラー関数)

各列を列挙するには、g(x、y)= 1のすべてのyを見つけます。

1〜xでは、xとiが互いに素である場合、iは[1 + x、2x]にあります。これは、各i素がxで追加され、共通因子が依然として1であるためです。

1≤y≤xファイ(x)があります

x +1≤y≤xにもファイ(x)があります

2x +1≤y≤xphi(x)もあります

.....

kx +1≤y≤b....直接統計

#include<bits/stdc++.h>
using namespace std;
int phi[2005];
void euler_phi(int n){
	for(int i=2;i<=n;i++) phi[i]=0;
	phi[1]=1;
	for(int i=2;i<=n;i++)if(!phi[n]){
		for(int j=i;j<=n;j+=i){
			if(!phi[j]) 
			phi[j]=j;
			phi[j]=phi[j]/i*(i-1);
		}
	}	
	
} 

bool gcd(int a,int b){
	return b==0 ? a:gcd(b,a%b);
}

int main(){
	euler_phi(2000);
	int a,b;
	while(scanf("%d%d", &a, &b) == 2 && a){
		long long sum=(long long)4*a*b+(long long)2*(a+b);
		int trees=0;
		for(int x=1;x<=a;x++){
			int k=b/x;
			trees+=(long long)phi[x]*k;
			for(int y=k*x+1;y<=b;y++){
				if(gcd(x,y)) trees++;
			}
			
		}
		trees *= 4; trees += 4;
		double ans = (double)trees / sum;
		printf("%.7lf\n", ans);
	}
	
	
}

 

公開された75元の記事 ウォン称賛77 ビュー4017

おすすめ

転載: blog.csdn.net/weixin_43568895/article/details/104870117