BZOJ1406 [AHOI2007]密码箱 数论
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1406
题意概括
求所有数x,满足 x<n 且 x2≡1 (mod n)。
n<=2 000 000 000
题解
对于所有的数x,如果 x2 ≡ 1 (mod n),
那么有 x2 mod n - 1 = 0
可以化为 (x + 1)(x - 1) mod n = 0
所以我们可以枚举 x - 1 以及 x+1 ,然后判断约数,这样答案会有重复,那么全部扔进一个set里面就好了。
代码
#include <cstring> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cmath> #include <set> using namespace std; typedef long long LL; LL n; set <LL> S; int main(){ scanf("%lld",&n); if (n==1){ puts("None"); return 0; } S.clear(); for (LL i=1;i*i<=n;i++) if (n%i==0){ LL y=n/i; for (LL x=y;x<=n;x+=y){ LL x1=x-2,x2=x+2; if ((x1*x)%n==0) S.insert((x-1)%n); if ((x2*x)%n==0) S.insert((x+1)%n); } } for (set <LL> :: iterator i=S.begin();i!=S.end();i++) printf("%lld\n",*i); return 0; }