The 11th Zhejiang University Programming Contest - G/ Gaussian Prime

返回目录

 

题目大意:在复平面上指定一个范围,求这个范围里的高斯素数的密度(即 高斯素数个数/总坐标数, 化为真分数) 。

 

题目类型:基础模拟题 / 数学背景题

 

题目分析:

 

A Gaussian integer a + bi is a Gaussian prime if and only if either:
①One of a, b is zero and the other is a prime number of the form 4n + 3 (with n a nonnegative integer) or its negative -(4n + 3), or
②Both are nonzero and a2 + b2 is a prime number (which will not be of the form 4n + 3).

 

按如上条件判断一个坐标(b, a)是不是高斯素数(这个很好写)。

 

开始我是觉得按照坐标轴象限的关系可以利用对称性,来减少判断次数,直接把每个坐标的结果(0 or 1)算出来储存在gp[201][201]里(-100 ≤ x1 ≤ x2 ≤ 100, -100 ≤ y1 ≤ y2 ≤ 100)。

但是可能哪里搞错了,WA了半天。

反正题目数据量不大。那就改成直接对应每组输入数据,枚举每个坐标,调用判断函数吧。结果A了。无奈。

这题有空再考虑考虑。

 

References
http://en.wikipedia.org/wiki/Gaussian_integer
Weisstein, Eric W. "Gaussian Prime." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/GaussianPrime.html

 

自己找的:http://tieba.baidu.com/f?kz=836401286 

 代码:

 

#include<cstdio> #include<cstring> using namespace std; #define MAXP 100010 int pr[MAXP]; void prime() //筛素数 { memset(pr, 0, sizeof(pr)); int n=MAXP; for(int i=2; i<=n; i++) if(!pr[i] && i<=110) //i<=110就可以了 for(int j=i * i; j<=n; j+=i) pr[j]=1; } int is(int a, int b) //判断函数 { if(!a && !b) return 0; if(a && b) //Both are nonzero { int t=a*a+b*b; if(!pr[t] && t%4 !=3) return 1; else return 0; } else //One of a, b is zero { a = a+b; //a为不为0的那个 a = a>0? a: -a; if(!pr[a] && a%4 == 3) return 1; else return 0; } } /* int gp[201][201]; //-100, -100 0,0 void get_gp() { //算四分之一平面 memset(gp, 0, sizeof(gp)); int a, b; for(b=0, a=0; a<=100; a++) if(is(a, b)) { gp[a][b] = 1; gp[a+100][b+100] = 1; } for(b=0, a=0; b<=100; b++) if(is(a, b)) { gp[a][b] = 1; gp[a+100][b+100] = 1; } for(b = 1; b<=100; b++) for(a = 1; a<=100; a++) if(is(a, b)) { gp[a][b]=1; gp[a+100][b+100]=1; gp[a+100][b]=1; gp[a][b+100]=1; } } */ int gcd(int x, int y) { return y? gcd(y, x%y) : x; } int main() { prime(); //get_gp(); int t; scanf("%d", &t); while(t--) { int x1, x2, y1, y2; scanf("%d%d%d%d", &x1, &x2, &y1, &y2); int sum=0; int tot=(x2-x1+1)*(y2-y1+1); //is(y, x); for(int i=x1; i<=x2; i++) for(int j=y1; j<=y2; j++) if(is(j, i)) sum++; int d = gcd(sum, tot); sum/=d; tot/=d; printf("%d/%d/n", sum, tot); } /* while(t--) { int x1, x2, y1, y2; scanf("%d%d%d%d", &x1, &x2, &y1, &y2); int sum=0; int tot=(x2-x1+1)*(y2-y1+1); //is(y, x); for(int i=x1; i<=x2; i++) for(int j=y1; j<=y2; j++) if(gp[j+100][i+100]) sum++; int d = gcd(sum, tot); sum/=d; tot/=d; printf("%d/%d/n", sum, tot); } */ }

 

你可能感兴趣的:(Web,Integer,BI)