您的位置:首页 > 其它

bzoj1406: [AHOI2007]密码箱

2017-04-25 07:34 411 查看
传送门

首先x2=kn+1

然后x2−1=kn

得到(x−1)(x+1)=kn+1

设x−1=k1n1,x+1=k2n2,k1k2=k,n1n2=n

爆枚n2(n2>n1),代入答案验证。

#include<cstring>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#define ll long long
using namespace std;
ll n,tot,b,s,a[1000005];
int main(){
scanf("%lld",&n);
tot=0;
for (ll i=1;i*i<=n;i++)
if (n%i==0){
b=n/i;
for (ll j=1;j<=n;j+=b)
if ((j+1)%i==0){
tot++;
a[tot]=j;
}
for (ll j=b-1;j<=n;j+=b)
if ((j-1)%i==0){
tot++;
a[tot]=j;
}
}
sort(a+1,a+1+tot);
s=0;
for (int i=1;i<=tot;i++)
if (a[i]!=a[i-1]) a[++s]=a[i];
if (!s) printf("None");
else for (int i=1;i<=s;i++) printf("%lld\n",a[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: