题目描述
给出n,求出所有x,满足x<n,且
(
n
−
0.5
x
)
/
(
n
−
x
)
(n - 0.5x) / (n - x)
(n−0.5x)/(n−x)为整数
从小到大输出
思路
退一下式子
设
(
n
−
0.5
x
)
/
(
n
−
x
)
=
k
(n - 0.5x) / (n - x) = k
(n−0.5x)/(n−x)=k
(
n
−
0.5
x
)
=
k
(
n
−
x
)
(n - 0.5x) = k(n - x)
(n−0.5x)=k(n−x)
2
n
−
x
=
2
k
(
n
−
x
)
2n - x = 2k(n - x)
2n−x=2k(n−x)
n
+
(
n
−
x
)
=
2
k
(
n
−
x
)
n + (n - x) = 2k(n - x)
n+(n−x)=2k(n−x)
n
=
(
2
k
−
1
)
(
n
−
x
)
n = (2k - 1)(n - x)
n=(2k−1)(n−x)
因为
(
n
−
x
)
(n - x)
(n−x)是n的因数
所以我们可以枚举
(
n
−
x
)
(n - x)
(n−x)
时间复杂度为
O
(
l
o
g
n
)
O(log\ n)
O(log n)
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll A[1000250];
ll n, tt, t;
int main()
{
scanf("%lld", &n);
for(ll i = 1; i <= (int)sqrt(n); i++)
if(n % i == 0)
{
ll a = n / i;
if(a & 1)A[++A[0]] = n - i;
if(i & 1)A[++A[0]] = n - n / i;
}
sort(A + 1, A + A[0] + 1);
tt = unique(A + 1, A + A[0] + 1) - A - 1;
t = 1;
while(!A[t])t++;
printf("%lld ", tt - t + 1);
for(ll i = t; i <= tt; ++i)
printf("%lld ", A[i]);
return 0;
}