結果
問題 | No.2795 Perfect Number |
ユーザー | ChiAn |
提出日時 | 2024-07-26 01:07:15 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 6 ms / 2,000 ms |
コード長 | 4,462 bytes |
コンパイル時間 | 2,153 ms |
コンパイル使用メモリ | 209,800 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-26 01:07:19 |
合計ジャッジ時間 | 3,648 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 1 ms
6,940 KB |
testcase_02 | AC | 1 ms
6,944 KB |
testcase_03 | AC | 1 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 3 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,944 KB |
testcase_08 | AC | 2 ms
6,944 KB |
testcase_09 | AC | 2 ms
6,940 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 2 ms
6,944 KB |
testcase_12 | AC | 2 ms
6,944 KB |
testcase_13 | AC | 2 ms
6,940 KB |
testcase_14 | AC | 2 ms
6,940 KB |
testcase_15 | AC | 2 ms
6,944 KB |
testcase_16 | AC | 2 ms
6,944 KB |
testcase_17 | AC | 2 ms
6,944 KB |
testcase_18 | AC | 2 ms
6,940 KB |
testcase_19 | AC | 3 ms
6,944 KB |
testcase_20 | AC | 3 ms
6,944 KB |
testcase_21 | AC | 3 ms
6,944 KB |
testcase_22 | AC | 3 ms
6,940 KB |
testcase_23 | AC | 4 ms
6,940 KB |
testcase_24 | AC | 2 ms
6,944 KB |
testcase_25 | AC | 3 ms
6,940 KB |
testcase_26 | AC | 4 ms
6,944 KB |
testcase_27 | AC | 4 ms
6,944 KB |
testcase_28 | AC | 2 ms
6,944 KB |
testcase_29 | AC | 1 ms
6,940 KB |
testcase_30 | AC | 2 ms
6,944 KB |
testcase_31 | AC | 2 ms
6,940 KB |
testcase_32 | AC | 1 ms
6,940 KB |
testcase_33 | AC | 2 ms
6,944 KB |
testcase_34 | AC | 2 ms
6,940 KB |
testcase_35 | AC | 6 ms
6,940 KB |
testcase_36 | AC | 3 ms
6,944 KB |
testcase_37 | AC | 4 ms
6,944 KB |
ソースコード
#include <bits/stdc++.h> /* * @autor:SEU-Yuan * @email:yuanyanghao2022@163.com * @date: 2024-07-25 23:30:36 */ #define pcc pair<char, char> #define pii pair<int, int> #define vi vector<int> #define vl vector<ll> #define rep(i, x, y) for (int i = x; i < y; i++) #define per(i, x, y) for (int i = x; i >= y; i--) #define rep0(i, n) for (int i = 0; i < (n); i++) #define per0(i, n) for (int i = (n) - 1; i >= 0; i--) #define mp make_pair #define pb push_back #define F first #define S second #define sz(x) (x).size() #define all(x) (x).begin(), (x).end() #define ll long long #define ull unsigned long long #define db double #define ld long double using namespace std; inline ll read() { ll x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } const double eps = 1e-9; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; const int maxn = 2e5 + 10; const int MAX = 1e5; const double pi = acos(-1.0); const ll INF = 0x3f3f3f3f3f3f3f; ll qpow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = (res * a) % mod; a = (a * a) % mod; b >>= 1; } return res % mod; } /***************main****************/ ll T = 1; ll m, n; //**************************************************************** // Miller_Rabin 算法进行素数测试 // 速度快,而且可以判断 <2^63的数 //**************************************************************** const int S = 20; // 随机算法判定次数,S越大,判错概率越小 // 计算 (a*b)%c. a,b都是long long的数,直接相乘可能溢出的 // a,b,c <2^63 long long mult_mod(long long a, long long b, long long c) { a %= c; b %= c; long long ret = 0; while (b) { if (b & 1) { ret += a; ret %= c; } a <<= 1; if (a >= c) a %= c; b >>= 1; } return ret; } // 计算 x^n %c long long pow_mod(long long x, long long n, long long mod) { if (n == 1) return x % mod; x %= mod; long long tmp = x; long long ret = 1; while (n) { if (n & 1) ret = mult_mod(ret, tmp, mod); tmp = mult_mod(tmp, tmp, mod); n >>= 1; } return ret; } // 以a为基,n-1=x*2^t a^(n-1)=1(mod n) 验证n是不是合数 // 一定是合数返回true,不一定返回false bool check(long long a, long long n, long long x, long long t) { long long ret = pow_mod(a, x, n); long long last = ret; for (int i = 1; i <= t; i++) { ret = mult_mod(ret, ret, n); if (ret == 1 && last != 1 && last != n - 1) return true; // 合数 last = ret; } if (ret != 1) return true; return false; } // Miller_Rabin()算法素数判定 // 是素数返回true.(可能是伪素数,但概率极小) // 合数返回false; bool Miller_Rabin(long long n) { if (n < 2) return false; if (n == 2) return true; if ((n & 1) == 0) return false; // 偶数 long long x = n - 1; long long t = 0; while ((x & 1) == 0) { x >>= 1; t++; } for (int i = 0; i < S; i++) { long long a = rand() % (n - 1) + 1; // rand()需要stdlib.h头文件 if (check(a, n, x, t)) return false; // 合数 } return true; } //************************************************ // pollard_rho 算法进行质因数分解 //************************************************ unordered_map<ll, ll> fac; long long gcd(long long a, long long b) { if (a == 0) return 1; if (a < 0) return gcd(-a, b); while (b) { long long t = a % b; a = b; b = t; } return a; } long long Pollard_rho(long long x, long long c) { long long i = 1, k = 2; long long x0 = rand() % x; long long y = x0; while (1) { i++; x0 = (mult_mod(x0, x0, x) + c) % x; long long d = gcd(y - x0, x); if (d != 1 && d != x) return d; if (y == x0) return x; if (i == k) { y = x0; k += k; } } } // 对n进行素因子分解 void findfac(long long n) { if (n == 1) return; if (Miller_Rabin(n)) { // 素数 fac[n]++; return; } long long p = n; while (p >= n) p = Pollard_rho(p, rand() % (n - 1) + 1); findfac(p); findfac(n / p); } int main() { n = read(); m = n; ll ans = 1; findfac(n); for (auto &[x, y] : fac) { ll res = 1, t = 1; for (int i = 0; i < y; i++) { t *= x; res += t; } ans *= res; } if (ans == (m << 1)) cout << "Yes\n"; else cout << "No\n"; return 0; }