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

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


考虑到使用平方差公式变形。
( x − 1 ) ( x + 1 ) ≡ 0 m o d    n (x-1)(x+1)\equiv0 \mod n (x1)(x+1)0modn
( x − 1 ) ( x + 1 ) = k n (x-1)(x+1)=kn (x1)(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 dx1或者 d ∣ x + 1 d|x+1 dx+1因此就很好判断了。
代码:

#include
#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;
}

你可能感兴趣的:(#,数论)