题目大意:求x2≡1(mod n)在x∈[1,n]的所有整数解.
做法:先将式子变形一下
x2≡1(mod n)⇐⇒(x+1)(x−1)=kn(k∈Z)
对于任意解x,总有
{x−1=k1ax+1=k2b 或 {x−1=k2bx+1=k1a
其中a
b=n且a<b.
那么我们将x+1取遍所有的b和k2,再将x−1取遍所有的b和k2即可不漏地得到所有解.
时间复杂度不会证…
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
ll n;
vector<ll> ans;
int main(){
scanf("%lld",&n);
for(ll i=1;i*i<=n;i++){
if(n%i) continue;
ll j=n/i;
for(ll k=0;k*j+1<=n;k++){
if(!((k*j+2)*(k*j)%n)) ans.push_back(k*j+1);
}
for(ll k=0;k*j-1<=n;k++){
if(!((k*j-2)*(k*j)%n)) ans.push_back(k*j-1);
}
}
sort(ans.begin(),ans.end());
if(!ans.size()){
printf("None\n");
return 0;
}
for(ll i=0;i<(ll)ans.size();i++){
if(ans[i]>0&&((!i)||ans[i]!=ans[i-1])) printf("%lld\n",ans[i]);
}
return 0;
}