传送门
简单数论暴力题。
题目简述:要求求出所有满足
x
2
≡
1
m
o
d
  
n
x^2\equiv1 \mod n
x2≡1modn且
0
≤
x
<
n
0\le x<n
0≤x<n的
x
x
x
考虑到使用平方差公式变形。
(
x
−
1
)
(
x
+
1
)
≡
0
m
o
d
  
n
(x-1)(x+1)\equiv0 \mod n
(x−1)(x+1)≡0modn
即
(
x
−
1
)
(
x
+
1
)
=
k
n
(x-1)(x+1)=kn
(x−1)(x+1)=kn
然后就可以枚举
n
n
n大于
s
q
r
t
n
sqrt_n
sqrtn的约数
d
d
d来求出可能的
x
x
x。
由上面的式子知道
d
∣
x
−
1
d|x-1
d∣x−1或者
d
∣
x
+
1
d|x+1
d∣x+1因此就很好判断了。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
int n,tot;
vector<int>ans,stk;
int main(){
scanf("%d",&n);
for(ri i=1;i*i<=n;++i)if(n%i==0)stk.push_back(n/i);
for(ri i=stk.size()-1;~i;--i){
int d=stk[i];
for(ri j=d;j<=n;j+=d){
if((j-2)%(n/d)==0)ans.push_back(j-1);
if((j+2)%(n/d)==0)ans.push_back(j+1);
}
}
sort(ans.begin(),ans.end()),tot=unique(ans.begin(),ans.end())-ans.begin()-1;
puts("1");
for(ri i=0;i<tot;++i)cout<<ans[i]<<'\n';
return 0;
}