传送门

https://www.cnblogs.com/violet-acmer/p/10201535.html

 

题意

  $n$ 个 $people$,编号 $1,2,3,\cdots ,n$ ,按顺时针方向围城一圈;

  初始,编号为 $1$ 的 $people$ 抱着一个球,他可以将球顺时针传给他左手边的第 $k$ 个 $people$;

  接到球的 $people$ 依次将球传给他顺时针方向的第 $k$ 个 $people$;

  循环进行,直到球再一次落到 $1$ 号 $people$ 手中,结束;

  定义一个开心值 :所有接到球的 $people$ 的编号和。

  求所有的开心值,并按升序排列。

题解

  弱弱的我只能通过打表找规律%%%%%%%那些一眼看出规律的大神们 

  $\begin{aligned} k &= 1\rightarrow 1 \\ k&= 2\rightarrow 1,3 \\ k&= 3\rightarrow 1,6 \\ k&= 4\rightarrow 1,4,10 \\ k&= 5\rightarrow 1,15 \\ k&= 6\rightarrow 1,5,9,21 \\ k&= 7\rightarrow 1,28\end{aligned}$

  刚开始,发现,有些数的开心值只有两个,然后,把这些只有两个开心值的数列了一下,发现,全是素数。

  不知为啥,求了一下每个数的因子个数,发现没,开心值的个数与他们的因子个数有关!!!

  然后,在草纸上列出了前 12 项的答案,找了一下规律,哇,最后10分钟,找到了一个前10个通用的规律。

  最后结束时刻提交,emmmmm,wa

  然后,睡觉,哈哈哈。

  今天,把昨天的错误数据看了一下,重新找了一下规律

  emmmm,找到了

  以 $k=15$ 为例:

    $15$ 的因子为 $1,3,5,15$

    开心值为 $1,18,35,120$

    1=1;

    18=1+6+11;                    //d=5,tot=3

    35=1+4+7+10+13;                   //d=3,tot=5

    120=1+2+3+4+5+6+7+8+9+10+11+12+13+14+15;         //d=1,tot=15

  发现没,开心值就是以 $15$ 的因子为公差的前 $tot$ 项和;

•Code

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 #define ll __int64
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 const int maxn=1e6+10;
10 
11 ll n;
12 ll a[maxn];
13 ll res[maxn];
14 
15 int factor()//求出n的所有因子
16 {
17     int x=sqrt(n);
18     a[1]=1;
19     int index=1;
20     for(int i=2;i <= x;++i)
21     {
22         if(n%i == 0)
23         {
24             a[++index]=i;
25             if(n/i != i)
26                 a[++index]=n/i;
27         }
28     }
29     a[++index]=n;
30     return index;
31 }
32 int main()
33 {
34     scanf("%d",&n);
35     int t=factor();
36     sort(a+1,a+t+1);
37     for(int i=1;i <= t;++i)
38     {
39         ll d=a[i],tot=n/d;
40         ll a1=1,an=a1+(tot-1)*d;
41         res[i]=tot*(a1+an)/2;
42     }
43     for(int i=t;i >= 1;--i)
44         printf("%I64d ",res[i]);
45 }
View Code

相关文章: