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 }


浙公网安备 33010602011771号