//ylwh ZOJ 3483 Accepted 188 KB 690 ms C++ (g++ 4.4.5) 1331 B 2011-08-04 17:44:00
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
int gprime[14] = {0, 3, 7, 11, 19, 23, 31, 43, 47, 59, 67, 71, 79, 83 };
int uprime[2249];
int prime(int x)
{
int i;
for(i=2; i<x; i++)
if(x % i == 0)
return 0;
return 1;
}
int Binsearch(int x, int end, int s[])
{
int begin = 1;
while( begin <= end )
{
int mid = ( begin + end )/2;
if( x == s[mid] ) return mid;
if( x > s[mid] )
begin = mid + 1;
else
end = mid - 1;
}
return 0;
}
int fun(int x)
{
if(x < 0)
return -x;
return x;
}
int gcd(int n,int m)
{
return m == 0 ? n : gcd(m,n%m);
}
int main()
{
int x1, x2, y1, y2, t, i, j, k, sum ,cnt;
j = 1;
for(i=2; i<= 20000; i++)
{
if( prime( i ) && !Binsearch( i, 13, gprime) )
uprime[j++] = i;
}
scanf("%d", &t);
while(t--)
{
cnt = 0;
scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
sum = (x2 - x1 + 1) * (y2 - y1 + 1);
for(i = x1; i <= x2; i++)
for(j = y1; j <= y2; j++)
{
if(i == 0 && Binsearch( fun(j) , 13, gprime) || j == 0 && Binsearch( fun(i), 13, gprime) )
cnt++;
if(i != 0 && j != 0 && Binsearch( fun(i*i + j*j), 2248, uprime) )
cnt++;
}
k = gcd(cnt, sum);
printf("%d/%d\n", cnt/k, sum/k);
}
return 0;
}
下边是学姐的代码(仰慕Ing..):
//2615303 2011-08-04 17:47:42 Accepted 3483 C++ 30 304 ylwh!
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAX = 30000;
int prim[MAX];
void init()
{
fill(prim,prim+MAX,1);
prim[0] = prim[1] = 0;
for(int i=2; i<MAX; i++)
for(int k=2; k*i<MAX; k++)
if( prim[i] == 1 )
prim[k*i] = 0;
for(int n=0; 4*n+3<MAX; n++)
if( prim[4*n+3] == 1 )
prim[4*n+3] = 2;
for(int i=1; i*i<MAX; i++)
for(int k=1; k*k+i*i<MAX; k++)
if( prim[i*i+k*k] == 1 )
prim[i*i+k*k] = 3;
}
int gcd(int n,int m)
{
return m == 0 ? n : gcd(m,n%m);
}
int main()
{
int ncases;
int x1,x2,y1,y2;
init();
scanf("%d",&ncases);
while( ncases-- )
{
scanf("%d %d %d %d",&x1,&x2,&y1,&y2);
int num = ((x2-x1)+1)*((y2-y1)+1);
int count = 0;
for(int i=x1; i<=x2; i++)
for(int k=y1; k<=y2; k++)
{
if( i == 0 && k != 0 )
if( k > 0 && prim[k] == 2 || k < 0 && prim[-k] == 2 )
count++;
if( k == 0 && i != 0 )
if( i > 0 && prim[i] == 2 || i < 0 && prim[-i] == 2 )
count++;
if( i != 0 && k != 0 && prim[i*i+k*k] == 3)
count++;
}
int wuyu = gcd(count,num);
printf("%d/%d\n",count/wuyu,num/wuyu);
}
return 0;
}