我认为素数是没有负数的,但是这题中貌似素数也可以是负的,这句话: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),那对数字加个绝对值就好了。
gcd(0,fenmu) = fenmu,所以这种情况永远输出的是0/1。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 110 * 110 + 110 * 110;
bool primes[MAX_N];
void get_primes()
{
memset(primes,0,sizeof primes);
primes[0]=primes[1]=1;
for(int i=2;i<MAX_N;i++)
{
if(!primes[i])
{
for(int j=i+i;j<MAX_N;j+=i)
{
primes[j]=1;
}
}
}
}
int gcd(int a ,int b)
{
return b == 0 ? a : gcd(b,a%b);
}
int ax, ay, bx, by, fenzi, fenmu;
void get_num()
{
for(int i = ax; i <= bx; i++)
{
for(int j = ay; j <= by; j++)
{
if(i == 0 && !primes[abs(j)] && (abs(j) - 3) % 4 == 0)
{
fenzi++;
//cout << i << " " << j << endl;
continue;
}
if(j == 0 && !primes[abs(i)] && (abs(i) - 3) % 4 == 0)
{
fenzi++;
//cout << i << " " << j << endl;
continue;
}
if(i != 0 && j != 0 && !primes[i * i + j * j] && ((i * i + j * j) - 3) % 4 != 0)
{
fenzi++;
//cout << i << " " << j << endl;
continue;
}
}
}
}
int main()
{
//freopen("out.txt", "w", stdout);
get_primes();
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d%d", &ax, &bx, &ay, &by);
fenmu = (bx - ax + 1) * (by - ay + 1);
fenzi = 0;
get_num();
/*if(fenzi == 0)
{
printf("0/%d\n", fenmu);
continue;
}*/
int g = gcd(fenmu, fenzi);
printf("%d/%d\n", fenzi / g, fenmu / g);
}
return 0;
}