1. 程式人生 > >Good Bye 2018 C. New Year and the Sphere Transmission

Good Bye 2018 C. New Year and the Sphere Transmission

傳送門

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

 

題意:

  n 個people,編號1~n,按順時針方向圍城一圈;

  初始,編號為1的people抱著一個球,他可以將球順時針傳給第 k 個people;

  接到球的people將球傳給他順時針方向的第 k 個people,迴圈進行,直到球再一次落到 1 號 people 手中結束;

  定義一個開心值 :所有接到球的 people 的編號和。

  求所有的開心值,並按升序排列。

題解:

  弱弱的我只能通過打表找規律%%%%%%%那些一眼看出規律的大神們 

  ===========
  i=1
  1
  ===========
  i=2
  1 3
  ===========
  i=3
  1 6
  ===========
  i=4
  1 4 10
  ===========
  i=5
  1 15
  ===========
  i=6
  1 5 9 21
  ===========
  i=7
  1 28
  ===========
  i=8
  1 6 16 36
  ===========
  i=9
  1 12 45
  ===========
  i=10
  1 7 25 55
  ===========
  i=11
  1 66
  ===========
  i=12
  1 8 15 22 36 78

  剛開始,發現,有些數的所有開心值只有兩個,然後,把這些只有兩個開心值得數列了一下,發現,全是素數。

  不知為啥,求了一下每個數的因子個數,發現沒,開心值的個數與他們的因子個數有關!!!!!!!

  然後,在草紙上列出了前12項的答案,找了一下規律,哇,最後10分鐘,找到了一個前10個通用的規律。

  最後結束時刻提交,emmmmm,wa

  然後,睡覺,哈哈哈

  今天,把昨天的錯誤資料看了一下,重新找了一下規律

  emmmm,找到了

  以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 項和

AC程式碼:

 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

打表找規律程式碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 #define ll __int64
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 const ll MOD=998244353;
 9 const int maxn=1e6+10;
10 
11 int n;
12 int a[maxn];
13 
14 int main()
15 {
16     for(int i=1;i <= 15;++i)
17     {
18         i=15;
19         int tot=0;
20         for(int k=1;k <= i;++k)
21         {
22             int res=1;
23             int index=1+k;
24             printf("****\nk=%d\n",k);
25             printf("1");
26             while(index != 1)
27             {
28                 if(index > i)
29                     index %= i;
30                 if(index == 1)
31                     break;
32                 res += index;
33                 printf("+%d",index);
34                 index += k;
35             }
36             printf("=%d\n",res);
37             a[tot++]=res;
38         }
39 
40         sort(a,a+tot);
41         int t=unique(a,a+tot)-a;
42         printf("\n===========\ni=%d\n",i);
43         for(int j=0;j < t;++j)
44             printf("%d ",a[j]);
45         break;
46     }
47 }
48 //1 27 105 235 625 1275
View Code