Jzoj P3520 原根___列舉
阿新 • • 發佈:2018-12-16
題目大意:
給出一個,求出它的所有原根,不存在輸出。
分析:
設 則有 然後直接求出來 然後列舉暴力判斷是否是原根即可 時間複雜度:
程式碼:
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <queue> #define N 10005 using namespace std; int prime[N], a[N], n, phi, cmt; int Gcd(int x, int y) { if (x < y) swap(x, y); while (1) { int r = x % y; x = y, y = r; if (r == 0) break; } return x; } int main() { freopen("math.in", "r", stdin); freopen("math.out", "w", stdout); scanf("%d", &n); phi = n, cmt = n; for (int i = 2; i * i <= n; i++) if (cmt % i == 0) { phi = phi - phi / i; while (cmt % i == 0) cmt /= i; } if (cmt > 1) phi = phi - phi / cmt; bool dop = 1; for (int i = 1; i <= n; i++) { if (Gcd(i, n) != 1) continue; bool flag = 0; int gg = 1; for (int j = 1; j < phi; j++) { gg = gg * i % n; if (gg == 1) { flag = 1; break; } } if (!flag) { dop = 0; printf("%d\n", i); } } if (dop) printf("-1\n"); return 0; }