結果
問題 | No.889 素数! |
ユーザー |
![]() |
提出日時 | 2019-09-20 22:56:47 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 6 ms / 2,000 ms |
コード長 | 3,836 bytes |
コンパイル時間 | 772 ms |
コンパイル使用メモリ | 72,376 KB |
実行使用メモリ | 7,936 KB |
最終ジャッジ日時 | 2024-09-14 19:09:50 |
合計ジャッジ時間 | 2,680 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 61 |
ソースコード
#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<list>#include<set>#include<string>using namespace std;int gcd(int a, int b) {int c = a % b;while (c != 0) {a = b;b = c;c = a % b;}return b;}struct UnionFind {vector<int> par; // par[i]:iの親の番号 (例) par[3] = 2 : 3の親が2UnionFind(int N) : par(N) { //最初は全てが根であるとして初期化for (int i = 0; i < N; i++) par[i] = i;}int root(int x) { // データxが属する木の根を再帰で得る:root(x) = {xの木の根}if (par[x] == x) return x;return par[x] = root(par[x]);}void unite(int x, int y) { // xとyの木を併合int rx = root(x); //xの根をrxint ry = root(y); //yの根をryif (rx == ry) return; //xとyの根が同じ(=同じ木にある)時はそのままpar[rx] = ry; //xとyの根が同じでない(=同じ木にない)時:xの根rxをyの根ryにつける}bool same(int x, int y) { // 2つのデータx, yが属する木が同じならtrueを返すint rx = root(x);int ry = root(y);return rx == ry;}};typedef long long ll;ll M = 1000000007;vector<ll> fac(300001); //n!(mod M)vector<ll> ifac(300001); //k!^{M-2} (mod M)ll mpow(ll x, ll n) {ll ans = 1;while (n != 0) {if (n & 1) ans = ans * x % M;x = x * x % M;n = n >> 1;}return ans;}void setcomb() {fac[0] = 1;ifac[0] = 1;for (ll i = 0; i < 1000000; i++) {fac[i + 1] = fac[i] * (i + 1) % M; // n!(mod M)}ifac[1000000] = mpow(fac[1000000], M - 2);for (ll i = 1000000; i > 0; i--) {ifac[i - 1] = ifac[i] * i%M;}}ll comb(ll a, ll b) {if (a == 0 && b == 0)return 1;if (a < b || a < 0)return 0;ll tmp = ifac[a - b] * ifac[b] % M;return tmp * fac[a] % M;}ll perm(ll a, ll b) {if (a == 0 && b == 0)return 1;if (a < b || a < 0)return 0;return fac[a] * ifac[a - b] % M;}// mod. m での a の逆元 a^{-1} を計算するlong long modinv(long long a) {long long b = M, u = 1, v = 0;while (b) {long long t = a / b;a -= t * b; swap(a, b);u -= t * v; swap(u, v);}u %= M;if (u < 0) u += M;return u;}vector<vector<ll>> mul(vector<vector<ll>> a, vector<vector<ll>> b, int n) {int i, j, k, t;vector<vector<ll>> c(n);for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {t = 0;for (k = 0; k < n; k++)t = (t + a[i][k] * b[k][j] % M) % M;c[i].push_back(t);}}return c;}template< typename Monoid >struct SegmentTree {int sz;vector< Monoid > seg;const Monoid M1;SegmentTree(int n, const Monoid &M1) : M1(M1) {sz = 1;while (sz < n) sz <<= 1;seg.assign(2 * sz, M1);}void set(int k, const Monoid &x) {seg[k + sz] = x;}void build() {for (int k = sz - 1; k > 0; k--) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}void update(int k, const Monoid &x) {k += sz;seg[k] = x;while (k >>= 1) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}Monoid query(int a, int b) {Monoid L = M1, R = M1;for (a += sz, b += sz; a < b; a >>= 1, b >>= 1) {if (a & 1) L = f(L, seg[a++]);if (b & 1) R = f(seg[--b], R);}return f(L, R);}Monoid value(const int &k) const {return seg[k + sz];}Monoid f(Monoid a, Monoid b) {return a + b;}};int main() {ll n, flag = 0, i, ans = 0;cin >> n;if (n == 0) {cout << "0" << endl;return 0;}if (n == 1) {cout << "1" << endl;return 0;}for (i = 2; i*i <= n; i++) {if (n%i == 0) {ans += i + n / i;flag = 1;}if (i*i == n && n >= 2) {cout << "Heihosu!" << endl;return 0;}if (i*i*i == n && n >= 2) {cout << "Ripposu!" << endl;return 0;}}if (ans + 1 == n) {cout << "Kanzensu!" << endl;return 0;}if (!flag) {cout << "Sosu!" << endl;return 0;}cout << n << endl;}