UVA10214 Trees in a Wood. 欧拉phi函数

只看某一个象限 能看到的数 == 一个 象限*4+4

能看到的树既距离原点的距离 gcd(x,y)==1

a 和 b 一大一小 预处理2000以内的phi函数,枚举小的一条边

从1…a 与 a gcd 为 1 的数的个数就是 phi(a)

从 1+a … 2*a与 a gcd 为 1 的数的个数 因为 GCD(i,a) = GCD(i+a,a) 所以还是 phi(a)

….

Trees in a Wood.

Time Limit:3000MSMemory Limit:Unknown64bit IO Format:%lld & %llu

Submit

Description

Problem HTrees in a Wood.Input:Standard InputOutput:Standard OutputTime Limit:10 secondsBackground

The saying “You can’t see the wood for the trees” is not only a cliche, but is also incorrect. The real problem is that you can’t see the trees for the wood. If you stand in the middle of a wood, the trees tend to obscure each other and the number of distinct trees you can actually see is quite small. This is especially true if the trees are planted in rows and columns, because they tend to line up. The purpose of this problem is to find how many distinct trees one can see if one were standing on the position of a tree in the middle of the wood.

The Problem

For a mathematically more precise description we assume that you are situated at the origin of a coordinate system in the plane.

Trees are planted at all positions

, with|x|<=aand|y|<=b.

A tree at position(x,y)can be seen from the origin if there are no other trees on the straight line from(0,0)to(x,y). Find the numberKof all the trees in the wood that can be seen from the origin and the numberNof all the trees to compute the fraction

.

Hint:The Euler phi function

is defined to be the number of integersmin the range1≤m≤nrelatively prime ton:

Instead of counting (an adequate method for smalln!) you could as well use the following identity:

Hint:Remember thatgcd(m,n)=gcd(m+n,n)=gcd(m+2n,n)=gcd(m+in,i)

You might be surprised that the fraction

converges to

0.607927 for an infinitely large wood.

The Input

Each scenario consists of a line with the two numbersaandb(separated by a white space), with1 <= a <= 2000and1 <= b <= 2000000Input is terminated by a line with two zeros.

The Output

For each scenario print a line containing the fraction

with a precision of 7 digits after the decimal point. Error less than 2e-7 or 2*10^(-7) will be tolerated.

Sample Input

3 20 0

Sample Output0.7058824

Collected from TUD Programming Contest

Source

Root :: AOAPC II: Beginning Algorithm Contests (Second Edition) (Rujia Liu) :: Chapter 10. Maths ::Examples

Submit

/* ***********************************************Author:CKbossCreated Time :2015年02月03日 星期二 22时13分33秒File Name:UVA10214.cpp************************************************ */#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <cmath>#include <cstdlib>#include <vector>#include <queue>#include <set>#include <map>using namespace std;int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}int phi[2200];int GCD[2020][2020];void phi_table(int n){phi[1]=1;for(int i=2;i<=n;i++){if(!phi[i]){for(int j=i;j<=n;j+=i){if(!phi[j]) phi[j]=j;phi[j]=phi[j]*(i-1)/i;}}}}void init(){phi_table(2010);for(int i=1;i<=2000;i++)for(int j=1;j<=2000;j++)if(GCD[i][j]==0)GCD[i][j]=GCD[j][i]=gcd(i,j);}int a,b;int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);init();while(scanf("%d%d",&a,&b)!=EOF){if(a==0&&b==0) break;if(a>b) swap(a,b);double ret=0;for(int i=1;i<=a;i++){int duan = b/i;int yu = b%i;ret += duan * phi[i];for(int j=1;j<=yu;j++){if(GCD[j][i]==1)ret+=1;}}ret = ret*4 + 4;double all = (2.*a+1)*(2.*b+1)-1.;double ans = ret/all;printf("%.7lf\n",ans);}return 0;}

,如果心在远方,只需勇敢前行,梦想自会引路,

UVA10214 Trees in a Wood. 欧拉phi函数

相关文章:

你感兴趣的文章:

标签云: