AOJ1325 Ginkgo Numbers

Ginkgo Numbers

We will define Ginkgo numbers and multiplication on Ginkgo numbers. A Ginkgo number is a pair where m and n are integers. For example, , and are Ginkgo numbers. A Ginkgo number is called a prime if m 2+ n 2 > 1 and it has exactly eight divisors.

与えられている 個目の性質だけを使った. を割り切れる数が という形で表せるか,という問題になり

フェルマーの二平方和定理 | 高校数学の美しい物語

整数論の美しい定理であるフェルマーの二平方和定理を解説します。平方剰余などの議論を用いた証明。

この記事通りに,素因数の型の指数が全て偶数かどうかを見て判断する. 以外に存在するか,ということで合計してつ以上あればとなる.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <map>
#include <set>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1<<30
#define pb push_back
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

map<ll,ll> prime_factor(ll n) {
  map<ll,ll> res;
  for(ll i=2; i*i <= n; i++) {
      while(n%i == 0) {
          res[i]++;
          n /= i;
      }
  }

  if(n != 1) res[n] = 1;
  return res;
}

int main() {
  int n;
  cin >> n;

  rep(i, n) {
      int m, n;
      cin >> m >> n;

      int s = m * m + n * n;
      int cnt = 0;

      REP(i, 1, s + 1) {
          if(s % i == 0) {
              map<ll, ll> ret = prime_factor(s / i);
              map<ll, ll>::iterator ite;
              bool flag = true;
              for(ite = ret.begin(); ite != ret.end(); ite++) {
                  if(ite->first  % 4 != 3) continue;
                  if(ite->second % 2 == 0) continue;
                  flag = false;
              }

              if(flag) {
                  cnt++;
              }
          }
      }

      if(cnt >= 3) cout << "C" << endl;
      else cout << "P" << endl;
  }

  return 0;
}
Mar 20th, 2016