首先说明结论,挑出所有与n互质的数,记他们的乘积是$mul$,记$p = mul \% n$,如果$p = 1$则输出这些序列即可,如果$p \ne 1$ 则去掉$p$后输出即可
证明:
1、为什么要挑所有与$n$互质的数来构造此数列?
答:首先我们知道,所有与$n$不互质的数$\mod n$的结果一定是不为$1$的,接下来证明这个就可以了记某个不和$n$互质的数$x (n \le x)$,由于$x$与$n$不互质,因此记$d = gcd(n, x) > 1$,因为$x \% n = \frac{x}{d}\times d \% \frac{n}{d}\times d = \frac{x}{d} \% \frac{n}{d} \times d^2$又因为$d > 1$,因此结果一定大于一
2、为什么$p \ne 1$就一定去掉p就可以了呢?
答:由于$p = mul \% n$,即$p = mul - \lfloor \frac{mul}{n} \rfloor \times n$,两边同除以p得到$\frac{mul}{p} = \lfloor \frac{mul}{n} \rfloor \times \frac{n}{p} + 1$这个式子的左边就是原来的乘积去掉p之后的结果(将$\lfloor \frac{mul}{n} \rfloor \times \frac{1}{p}$看作一个整体即可),这个式子整体表达的就是左式$ \mod n = 1$再看p的范围, 因为$p = mul \% n$,所以$0 \le p \le n - 1$,因此再证其和n互质即可,接下来证明这个:因为$gcd(mul, n) = gcd(mul \% n, n) = 1$,并且$p = mul \% n$,所以$gcd(p, n) == 1$
证毕
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL,LL> PLL;
const int INF = 0x3f3f3f3f;
inline int lc(int u) {return u << 1;}
inline int rc(int u) {return u << 1 | 1;}
inline void solve() {
int n; cin >> n;
vector<int> v;
int cnt = 0;
LL res = 1;
for (int i = 1; i < n; i ++ ) {
if (__gcd(i, n) == 1) {
cnt ++ ;
v.push_back(i);
res = res * i % n;
}
}
if (res != 1) v.pop_back(), cnt --;
cout << cnt << endl;
for (auto ite : v) cout << ite << ' ';
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
// int t; cin >> t;
// while (t -- )
solve();
return 0;
}
Orz,time佬yyds