C. Product 1 Modulo N
https://codeforces.com/problemset/problem/1514/C
题意:求1~n中,最长的乘积模n后为1的子序列.
思路:模n为1说明序列的乘积为n的乘法逆元,则每个元素都与n互质.默认序列包含了所有与n互质的元素,最后看模n后结果是否为1,如果不为1,则从序列中移除该质数即可.
inline void solve() {
int n;
cin >> n;
vector<bool> ok(n + 1, false);
long long rem = 1;
for (int i = 1; i < n; ++i) {
ok[i] = (::gcd(i, n) == 1);
if (ok[i]) {
rem = (rem * i) % n;
}
}
if (rem != 1) {
ok[rem] = false;
}
cout << count(ok.begin(), ok.end(), true) << '\n';
for (int i = 1; i < n; ++i) {
if (ok[i]) {
cout << i << ' ';
}
}
}

浙公网安备 33010602011771号