首先与n不互质的数是一定不选的,先用mul存下
1
1
1 ~
n
−
1
n-1
n−1中所有与n互质的数的积,
g
c
d
(
m
u
l
,
n
)
=
1
gcd(mul,n)=1
gcd(mul,n)=1
令
p
=
m
u
l
p=mul
p=mul
m
o
d
mod
mod
n
n
n,能得出
g
c
d
(
p
,
n
)
=
1
gcd(p,n)=1
gcd(p,n)=1,如果
p
p
p恰好为1,那么直接输出。
否则去掉
p
p
p这个数,为什么这样就行了呢?
m
u
l
=
k
∗
n
+
p
mul=k*n+p
mul=k∗n+p ,
m
u
l
/
p
=
k
/
p
∗
n
+
1
mul/p=k/p*n+1
mul/p=k/p∗n+1,只要证明
k
/
p
k/p
k/p为整数即可
因为
m
u
l
mul
mul为
1
1
1 ~
n
−
1
n-1
n−1中所有与n互质的数的乘积,那么
p
p
p这个数一定是被乘进去过的,因为前面已经得出了
p
p
p与
n
n
n互质,那么
m
u
l
mul
mul一定为
p
p
p的倍数
k
=
(
m
u
l
−
p
)
/
n
k=(mul-p)/n
k=(mul−p)/n, 且
k
k
k为整数
所以
(
m
u
l
−
p
)
(mul-p)
(mul−p)能被
n
n
n整除,又因为
m
u
l
mul
mul为
p
p
p的倍数
所以
(
m
u
l
−
p
)
(mul-p)
(mul−p)能
p
p
p被整除
又因为
n
n
n与
p
p
p互质,
(
m
u
l
−
p
)
(mul-p)
(mul−p)能被
n
∗
p
n*p
n∗p整除
那么
k
/
p
=
(
m
u
l
−
p
)
/
(
n
∗
p
)
k/p=(mul-p)/(n*p)
k/p=(mul−p)/(n∗p),
k
/
p
k/p
k/p为整数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool vis[100010];
int main()
{
int n,mul=1;
cin>>n;
for(int i=1;i<n;i++)
if(__gcd(i,n)==1)
{
mul=(ll)mul*i%n;
vis[i]=1;
}
if(mul!=1)vis[mul]=0;
cout<<count(vis+1,vis+n,1)<<endl;
for(int i=1;i<n;i++)
if(vis[i])cout<<i<<' ';
puts("");
return 0;
}