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]密码箱的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1406: [AHOI2007]密码箱

bzoj1406: [AHOI2007]密码箱

1406: [AHOI2007]密码箱

1406: [AHOI2007]密码箱

BZOJ-1406密码箱 约数 + 乱搞 + set?

题解 P4296 [AHOI2007]密码箱