点此看题面

大致题意: 给定\(n\),求所有\(x\)满足\(0\le x<n\)\(x^2\equiv1(mod\ n)\)

前言

日常傻逼题犯傻逼错误,一个许久未见的智障错误今日重出江湖:

if(n==1) return puts("None");

我居然还认认真真找了半天的数据来\(Hack\)自己。。。

大致想法

显然:

\[x^2\equiv1(mod\ n)\Rightarrow x^2-1\equiv0(mod\ n)\Rightarrow(x-1)(x+1)\equiv0(mod\ n) \]

\(n=pq(p<q)\),则相当于至少要存在一对\(p,q\)满足\(p|(x-1),q|(x+1)\)\(p|(x+1),q|(x-1)\)

则我们\(O(\sqrt n)\)枚举\(p\),然后枚举\(q\)的倍数(显然不到\(\sqrt n\)个,且实际的\(p\)也只有\(\sqrt[3]n\)个左右)作为\(x-1\)\(x+1\),然后相对应去判断\(x+1\)/\(x-1\)是否为\(p\)的倍数即可。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
using namespace std;
int n;set<int> s;set<int>::iterator it;
int main()
{
	RI i,j;if(scanf("%d",&n),n==1) return puts("None"),0;s.insert(1),s.insert(n-1);//特判n=1,初始扔入±1的答案
	for(i=2;1LL*i*i<=n;++i) if(!(n%i)) for(j=n/i;j^n;j+=n/i)//枚举p,q
		!((j-2)%i)&&(s.insert(j-1),0),!((j+2)%i)&&(s.insert(j+1),0);//判断是否合法
	for(it=s.begin();it!=s.end();++it) printf("%d\n",*it);return 0;//迭代器遍历set输出答案
}

相关文章:

  • 2021-07-13
  • 2021-12-09
  • 2021-06-22
  • 2021-12-08
  • 2022-12-23
  • 2022-02-01
  • 2021-08-05
  • 2022-01-05
猜你喜欢
  • 2021-10-06
  • 2022-12-23
  • 2018-02-05
  • 2021-09-19
  • 2022-12-23
  • 2021-07-17
相关资源
相似解决方案