題目鏈接:C. New Year and the Sphere Transmission
There are people sitting in a circle, numbered from to in the order in which they are seated. That is, for all from to , the people with id and are adjacent. People with id and are adjacent as well.
The person with id initially has a ball. He picks a positive integer at most , and passes the ball to his -th neighbour in the direction of increasing ids, that person passes the ball to his -th neighbour in the same direction, and so on until the person with the id gets the ball back. When he gets it back, people do not pass the ball any more.
For instance, if and , the ball is passed in order .
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 .
Find and report the set of possible fun values for all choices of positive integer . It can be shown that under the constraints of the problem, the ball always gets back to the -st player after finitely many steps, and there are no more than possible fun values for given .
Input
The only line consists of a single integer () — the number of people playing with the ball.
Output
Suppose the set of all fun values is .
Output a single line containing space separated integers through 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 yields fun value , as does . Picking results in fun value of . For we get fun value and with or we get .
In the second sample, the values , , , and are achieved for instance for , , , and , respectively.
思路
有個數圍成一個環,編號是從到 ,現在你可以隨意選擇一個不超過的數,從開始,按照環上字符增大的順序,每隔個選擇一個數字,直到回到起點,然後計算出路徑上不同數字的和,記爲fun value
,題目給出你一個數,然後讓你求出這個數的所有的fun value
,從小到大輸出結果。
如果選擇的是的因數,那麼一定可以一輪就走完,不同的因數,獲得的fun value
的值也不一樣。
當選擇的不是的因數時,那麼一輪一定走不完,然後直到某一輪走的路徑正好和是的因數的某一條路徑重合,所以我們計算是的因數的路徑時,已經把這種情況包含了。
所以,利用等差數列求和公式可以計算出結果。第一項一定爲,數字的個數就是當前枚舉的或者.
可以打個表驗證一下:
打表代碼#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;
}