[数学]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]); }
在日渐沉没的世界里,我发现了你。