题目链接: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