传送门
首先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]);
}