bzoj1406: [AHOI2007]密码箱
Posted invoid
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1406: [AHOI2007]密码箱相关的知识,希望对你有一定的参考价值。
数学。
x^2 % n = 1 则 (x+1)(x-1) = kn.
设 x+1 = k1*n1, x-1=k2*n2。 则 k1*k2=k , n1*n2=n。
算出每个大于sqrt(n)的约数,然后分别作n1,n2尝试是否可行。
算x一定要取模。否则1会变成n+1。
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> using namespace std; const int maxn = 100000 + 10; int res[maxn]; int n,m,cnt; long long t,j; int main() { cin >> n; cnt=0; if(n==1) {printf("None\n"); return 0;} m=(int) sqrt(n+0.5); for(int i=1;i<=m;i++) if(n%i==0) { j=n/i; for(t=j;t<=n;t+=j) { if((t-2)%i==0) res[++cnt]=(t-1)%n; if((t+2)%i==0) res[++cnt]=(t+1)%n; } } sort(res+1,res+cnt+1); for(int i=1;i<=cnt;i++) if(res[i]!=res[i-1]) printf("%d\n",res[i]); return 0; }
以上是关于bzoj1406: [AHOI2007]密码箱的主要内容,如果未能解决你的问题,请参考以下文章