Good Bye 2018 C. New Year and the Sphere Transmission(数学)

题目链接:C. New Year and the Sphere Transmission

There are nn people sitting in a circle, numbered from 11 to nn in the order in which they are seated. That is, for all ii from 11 to n1n-1, the people with id ii and i+1i+1 are adjacent. People with id nn and 11 are adjacent as well.

The person with id 11 initially has a ball. He picks a positive integer kk at most nn, and passes the ball to his kk-th neighbour in the direction of increasing ids, that person passes the ball to his kk-th neighbour in the same direction, and so on until the person with the id 11 gets the ball back. When he gets it back, people do not pass the ball any more.

For instance, if n=6n = 6 and k=4k = 4, the ball is passed in order [1,5,3,1][1, 5, 3, 1].

Consider the set of all people that touched the ball. The fun value of the game is the sum of the ids of people that touched it. In the above example, the fun value would be 1+5+3=91 + 5 + 3 = 9.

Find and report the set of possible fun values for all choices of positive integer kk. It can be shown that under the constraints of the problem, the ball always gets back to the 11-st player after finitely many steps, and there are no more than 10510^5 possible fun values for given nn.

Input

The only line consists of a single integer nn (2n1092 \leq n \leq 10^9) — the number of people playing with the ball.

Output

Suppose the set of all fun values is f1,f2,,fmf_1, f_2, \dots, f_m.

Output a single line containing mm space separated integers f1f_1 through fmf_m in increasing order.

Examples

Input

6

Output

1 5 9 21

Input

16

Output

1 10 28 64 136

Note

In the first sample, we’ve already shown that picking k=4k = 4 yields fun value 99, as does k=2k = 2. Picking k=6k = 6 results in fun value of 11. For k=3k = 3 we get fun value 55 and with k=1k = 1 or k=5k = 5 we get 2121.

Good Bye 2018 C. New Year and the Sphere Transmission(数学)

In the second sample, the values 11, 1010, 2828, 6464 and 136136 are achieved for instance for k=16k = 16, 88, 44, 1010 and 1111, respectively.

思路

nn个数围成一个环,编号是从11nn ,现在你可以随意选择一个不超过nn的数kk,从11开始,按照环上字符增大的顺序,每隔kk个选择一个数字,直到回到起点11,然后计算出路径上不同数字的和,记为fun value,题目给出你一个数nn,然后让你求出这nn个数的所有的fun value,从小到大输出结果。

如果选择的kknn的因数,那么一定可以一轮就走完,不同的因数,获得的fun value的值也不一样。

当选择的kk不是nn的因数时,那么一轮一定走不完,然后直到某一轮走的路径正好和kknn的因数的某一条路径重合,所以我们计算kknn的因数的路径时,已经把这种情况包含了。

所以,利用等差数列求和公式Sn=n(a1+an)2S_n=\frac{n(a_1+a_n)}{2}可以计算出结果。第一项一定为11,数字的个数就是当前枚举的ii或者ni\frac{n}{i}.

可以打个表验证一下:

打表代码
#include <bits/stdc++.h>
using namespace std;
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long ll;
int get_x(int n, int x)
{
    if (x == n)
        return 1;
    int s = x, sum = x + 1;
    while (s != 0)
    {
        s = (s + x) % n;
        sum += (s + 1);
    }
    return sum;
}
set<int> getall_n(int n)
{
    set<int> s;
    for (int i = 1; i <= n; i++)
        s.insert(get_x(n, i));
    return s;
}
int main()
{
    for (int i = 1; i <= 100; i++)
    {
        printf("n=%d:\n", i);
        set<int> s = getall_n(i);
        for (auto x : s)
            printf("%d ", x);
        printf("\n");
    }
    return 0;
}

然后印证了我们的观点,每个数的答案个数就是他的因子个数。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
set<ll> s;
int main()
{
    ll n;
    scanf("%lld", &n);
    for (ll i = 1; i * i <= n; i++)
    {
        if (n % i == 0)
        {
            ll x = n / i;
            s.insert((1 + n - i + 1) * x / 2);
            s.insert((1 + n - x + 1) * i / 2);
        }
    }
    for (auto x : s)
        printf("%lld ", x);
    puts("");
    return 0;
}