[数学]luogu P4296 [AHOI2007]密码箱

题面

https://www.luogu.com.cn/problem/P4296

分析

移项得x^2-1=0(mod n) 即平方差公式

即存在 x,x-2 ,其中有一个数满足为n的倍数

设 kab=kn 满足(ka±2)%b==0

在根号n范围内枚举a,记录合法a,b

则时间复杂度为$O(2\sqrt{n})$

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=5e5;
ll n,ans[N];
int cnt;

int main() {
    scanf("%lld",&n);
    if (n==1) return printf("None"),0;
    for (ll i=1,j;i*i<=n;i++)
        if (n%i==0) {
            j=n/i;
            for (ll k=1;k*j<=n;k++) {
                if ((k*j-2ll)%i==0) ans[++cnt]=k*j-1ll;
                if ((k*j+2ll)%i==0) ans[++cnt]=(k*j+1ll)%n;
            }
        }
    sort(ans+1,ans+cnt+1);ans[0]=1;cnt=unique(ans,ans+cnt+1)-ans-1;
    for (int i=0;i<=cnt;i++) printf("%lld\n",ans[i]);
}
View Code

 

posted @ 2020-10-21 22:00  Vagari  阅读(109)  评论(0编辑  收藏  举报