题目大意: 给定n,求[1,n)内所有满足x2≡1(modn)的x
题解:
x2≡1(modn)−>
x2−1≡0(modn)−>
(x+1)(x−1)=kn−>
n|(x+1)(x−1)
不妨设n=pq,则
(p|x+1且q|x−1)或(p|x−1且q|x+1)
在O(n√)内枚举n的每一对约数,分别枚举x,使得(x+1),(x−1)分别为较大约数倍数,此时验证是否满足另一个条件即可
最后去一下重
同时证明了只有n=1时无解,n>1时至少有解1
复杂度玄学,据TA爷Blog上说是 T(d(n)∗n√)≈T(n/10)
我的收获:因数拆分强啊……若n=p*q,且p、q等价,则小的那个是 n√ 的
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
int n;
set<int> p;
set<int>::iterator it;
void work()
{
if(n==1){puts("None");return ;}
for(int i=1;i*i<=n;i++)
if(!(n%i)){
int a=i,b=n/a;
for(int x=1;x<=n;x+=b) if((x+1)%a==0) p.insert(x);//(x-1)%b==0
for(int x=b-1;x<=n;x+=b) if((x-1)%a==0) p.insert(x);//(x+1)%b==0
}
for(it=p.begin();it!=p.end();it++) printf("%d\n",*it);
}
void init(){
cin>>n;
}
int main()
{
init();
work();
return 0;
}