题目
分析
一道有点意思的题目...
主要难点在于想到移项,就是把原式转化成平方差的形式,然后把(n)拆分成(a,b)
这样做了之后我们就发现(a)整除((x-1))且(b)整除((x+1))或者(a)整除((x+1))且(b)整除((x-1))的时候,(x)满足题意
枚举(a)和(k*b+1,k*b-1),然后判断这个(k*b+1(-1))是否被(a)整除即可
代码
#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
x=0;char ch=getchar();bool f=false;
while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return ;
}
template <typename T>
inline void write(T x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10^48);
return ;
}
#define ll long long
ll n,now;
set<ll> s;
int main(){
read(n);
if(n==1){
puts("None");
return 0;
}
s.insert(1);
now=sqrt(n);
for(ll i=1;i<=now;i++){
if(n%i==0){
ll b=n/i;
for(ll j=b+1;j<=n;j+=b) if((j+1)%i==0) s.insert(j);
for(ll j=b-1;j<=n;j+=b) if((j-1)%i==0) s.insert(j);
}
}
if(!s.size()) puts("None");
for(set<ll>::iterator it=s.begin();it!=s.end();it++) write(*it),putchar('
');
return 0;
}