UVA 10214 Trees in a Wood(欧拉函数)

枚举每列,只要找到g(x,y)=1中的所有y即可。

因为1~x中,与x互质的假如有i个,那么[1+x,2x]中也有i个,因为相当于那互质的i个每个加了x,公因数还是1

1≤y≤x         有phi(x)个

x+1≤y≤x      也有phi(x)个

2x+1≤y≤x   也有phi(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