1415 - Gauss Prime

 1)当a != 0 && b != 0 时,只有在 a^2 + 2 * b^2是素数的情况下a + b * sqrt(-2)才是高斯素数;

 2)当a == 0时,a + b * sqrt(-2) 不是高斯素数;

 3)b不会是0, 题目中有限制;

以上结论来自这里: http://mathworld.wolfram.com/GaussianPrime.html

根据以上结论程序很好写了, 就是判断素数;

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 using namespace std;
 6 
 7 typedef long long ll;
 8 ll k[] = {1,2,3,7,11,19,43,67,163};
 9 ll pow_mod(ll a, ll p, ll n) {
10     a %= n;
11     ll ans = 1;
12     for(; p; p >>= 1) {
13         if(p & 1) {
14             ans = (ans * a ) % n;
15         }
16         a = (a * a) % n;
17     }
18     return ans;
19 }
20 ll mul_mod(ll a, ll b, ll n) {
21     return a * b % n;
22 }
23 bool miller_rabin(ll a, ll n) {
24     ll r = 0, s = n - 1, j;
25     while(!(s & 1)) {
26         s >>= 1; ++r;
27     }
28     ll x = pow_mod(a, s, n);
29     if(x == 1) return true;
30     for(j = 0; j < r; ++j, x = mul_mod(x, x, n)) {
31         if(x == n - 1) return true;
32     }
33     return false;
34 }
35 /*
36 bool isprime(ll n) {
37 //    cout << n << endl;
38     for(int i = 2; i < 1000 && i < n; ++i) if( n % i == 0) return false;
39     if(!miller_rabin(2, n)) return false;
40     if(!miller_rabin(3, n)) return false;
41     if(!miller_rabin(5, n)) return false;
42     if(!miller_rabin(7, n)) return false;
43     if(!miller_rabin(11, n)) return false;
44     if(!miller_rabin(13, n)) return false;
45     if(!miller_rabin(17, n)) return false;
46     return true;
47 }
48 */
49 bool isprime(ll n) {
50     if(n == 1 || n == 0) return false;
51     for(ll i = 2; i * i <= n; ++i) {
52         if(n % i == 0) {
53             return false;
54         }
55     }
56     return true;
57 }
58 int main() {
59     int T;
60     cin >> T;
61     while(T--) {
62         ll a, b;
63         cin >> a >> b;
64         bool flg = false;
65         if(a != 0 && b != 0) {
66             if(isprime(a * a + 2 * b * b)) {
67                 flg = true;
68             }
69         }
70         if(flg) cout << "Yes" << endl;
71         else cout << "No" << endl;
72     }
73     return 0;
74 }

 

posted @ 2013-01-29 20:55  ACSeed  Views(185)  Comments(0)    收藏  举报