题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4280
In number theory, a Gaussian integer is a complex number whose real and imaginary part are both integers. The Gaussian integers, with ordinary addition and multiplication of complex numbers, form an integral domain, usually written as Z[i]. The prime elements of Z[i] are also known as Gaussian primes. Gaussian integers can be uniquely factored in terms of Gaussian primes up to powers of i and rearrangements.
A Gaussian integer a + bi is a Gaussian prime if and only if either:
0 is not Gaussian prime. 1, -1, i, and -i are the units of Z[i], but not Gaussian primes. 3, 7, 11, ... are both primes and Gaussian primes. 2 is prime, but is not Gaussian prime, as 2 = i(1-i)2.
Your task is to calculate the density of Gaussian primes in the complex plane [x1, x2] × [y1, y2]. The density is defined as the number of Gaussian primes divided by the number of Gaussian integers.
There are multiple test cases. The first line of input is an integer T ≈ 100 indicating the number of test cases.
Each test case consists of a line containing 4 integers -100 ≤ x1 ≤ x2 ≤ 100, -100 ≤ y1 ≤ y2 ≤ 100.
For each test case, output the answer as an irreducible fraction.
3 0 0 0 0 0 0 0 10 0 3 0 3
0/1 2/11 7/16
代码如下:
//#pragma warning (disable:4786) #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <cstdlib> #include <climits> #include <ctype.h> #include <queue> #include <stack> #include <vector> #include <utility> #include <deque> #include <set> #include <map> #include <iostream> #include <algorithm> using namespace std; const double eps = 1e-9; //const double pi = atan(1.0)*4; const double pi = 3.1415926535897932384626; const double e = exp(1.0); #define INF 0x3f3f3f3f //#define INF 1e18 //typedef long long LL; //typedef __int64 LL; #define ONLINE_JUDGE #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif #define maxn 100000 int prim[maxn]; void init() { for(int i = 2; i <= maxn; i++) { if(!prim[i]) { for(int j = i+i; j <= maxn; j+=i) { prim[j] = 1; } } } } int GCD(int a, int b) { if(b == 0) return a; return GCD(b,a%b); } int main() { int t; init(); scanf("%d",&t); int x1, x2, y1, y2; while(t--) { cin>>x1>>x2>>y1>>y2; int ans = 0; int tem; for(int x = x1; x <= x2; x++) { for(int y = y1; y <= y2; y++) { if(x == 0) { if(y < 0) { tem = -y; } else tem = y; if((tem-3)%4==0 && prim[tem]==0) ans++; } else if(y == 0) { if(x < 0) { tem = -x; } else tem = x; if((tem-3)%4==0 && prim[tem]==0) ans++; } else { tem = x*x+y*y; if(prim[tem]==0 && (tem-3)%4!=0) ans++; } } } int tol = (x2-x1+1)*(y2-y1+1); int gcd = GCD(ans,tol); printf("%d/%d\n",ans/gcd,tol/gcd); } return 0; }
原文地址:http://blog.csdn.net/u012860063/article/details/44871197