Good Bye 2018 C. New Year and the Sphere Transmission(数学)
题目链接: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;
}