码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2409 Let it Bead

时间:2017-12-28 23:23:31      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:strong   nbsp   个数   color   左右   printf   turn   cst   a*   

一道好题。

我们考虑旋转和翻转的循环节个数就可以了。

先说旋转:

旋转应该是朝着一个方向从旋转1个到n个

技术分享图片此时循环节个数为1

技术分享图片此时循环节个数为2

从上面两个我们可以看出旋转长度为k时,循环节长度为lcm(n,k)/k,所以循环节个数为n/lcm(n,k)/k=gcd(n,k)

再说翻转:

考虑奇偶

奇:

技术分享图片循环节个数为3

共可以翻转n次循环节长度为n/2,所以循环节个数为(n+1)/2

偶:

分两种情况讨论

技术分享图片循环节个数为2

共可以左右对称n/2次,循环节长度为2,循环节个数为n/2

技术分享图片循环节个数为3

共可以对角线对称n/2次,循环节长度为2,循环节个数为(n-2)/2+2

所以到这里我们就把所有情况讨论了。

 技术分享图片

代码 By:大奕哥

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 #include<cstring>
 6 using namespace std;
 7 int n,m,sum;
 8 int gcd(int x,int y)
 9 {
10     if(!y)return x;
11     return gcd(y,x%y);
12 }
13 int quick_mod(int a,int b)
14 {
15     int ans=1;
16     while(b)
17     {
18         if(b&1)ans=ans*a;
19         a=a*a;b>>=1;
20     }
21     return ans;
22 }
23 int main()
24 {
25     while(~scanf("%d%d",&m,&n)&&n&&m)
26     {
27         sum=0;for(int i=1;i<=n;++i)sum+=quick_mod(m,gcd(n,i));
28         if(n&1)sum+=n*quick_mod(m,(n+1)/2);
29         else sum+=(n/2)*(quick_mod(m,n/2)+quick_mod(m,(n+2)/2));
30         sum=sum/(n*2);printf("%d\n",sum);
31     }
32     return 0;
33 }

 

POJ2409 Let it Bead

标签:strong   nbsp   个数   color   左右   printf   turn   cst   a*   

原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8137635.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!