首页 > 其他 > 详细

bzoj1406: [AHOI2007]密码箱

时间:2016-06-26 00:22:17      阅读:304      评论:0      收藏:0      [点我收藏+]

数学。

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]密码箱

原文:http://www.cnblogs.com/invoid/p/5617090.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!