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 1275View Code