化简一下式子。
(x+1)(x-1)=k*n
x+1=k1n1 x-1=k2n2 k1k2=k n1n2=n
那么我们枚举n的大于根号n的因子n1,然后枚举一个k1,之后把k1n1分别作为x+1和x-1来求解,看一看求出的另一个是否是n/n1的倍数,注意用set去重。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<set> #define maxn 2000000000 using namespace std; set<int> p; int n; int main() { scanf("%d",&n); for (int i=1;i*i<=n;i++) if (n%i==0) { int b=n/i; for (int j=1;j<=n;j+=b) if ((j+1)%i==0) p.insert(j); for (int j=b-1;j<=n;j+=b) if ((j-1)%i==0) p.insert(j); } if (!p.size()) printf("None\n"); set<int>::iterator i; for (i=p.begin();i!=p.end();i++) printf("%d\n",*i); return 0; }