题目:
分析:
根据上面的式子,我们可以得出
N
x
+
1
\frac{N}{x}+1
xN+1为偶数,因为
1
1
1是奇数,而奇数+奇数才等于偶数,故
N
x
\frac{N}{x}
xN为奇数,同时也为整数
因为是整数,所以
x
x
x是
N
N
N的约数,这样以来,我们就可以使用
O
(
n
)
O(\sqrt{n})
O(n)的算法,枚举
N
N
N的约数
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<list>
#include<ctime>
#include<iomanip>
#include<string>
#include<bitset>
#include<deque>
#include<set>
#define LL unsigned long long
#define h happy
#define ch cheap
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
vector<LL> v;
int main()
{
LL n=read();
for(LL i=1;i<=sqrt(n);i++)
{
if(!(n%i))
{
if((n/i)%2) v.push_back(n-i);
if(i!=n/i)
{
LL w=n/i;
if((n/w)%2) v.push_back(n-w);
}
}
}
sort(v.begin(),v.end());
printf("%d",v.size()-1);
if(v.size()>1)
{
printf(" ");
for(int i=1;i<v.size();i++) if(v[i])printf("%llu ",v[i]);
}
return 0;
}