2018.12.17 bzoj1406 : [AHOI2007]密码箱(简单数论)

版权声明:随意转载哦......但还是请注明出处吧: https://blog.csdn.net/dreaming__ldx/article/details/85050177

传送门
简单数论暴力题。
题目简述:要求求出所有满足 x 2 1 m o d    n x^2\equiv1 \mod n 0 x < n 0\le x<n x x


考虑到使用平方差公式变形。
( x 1 ) ( x + 1 ) 0 m o d    n (x-1)(x+1)\equiv0 \mod n
( x 1 ) ( x + 1 ) = k n (x-1)(x+1)=kn
然后就可以枚举 n n 大于 s q r t n sqrt_n 的约数 d d 来求出可能的 x x
由上面的式子知道 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;
}

猜你喜欢

转载自blog.csdn.net/dreaming__ldx/article/details/85050177