首页 > 代码库 > zoj1873 Let it Bead
zoj1873 Let it Bead
思路:polya裸题,如果是旋转,对于旋转i格的循环节长度len=lcm(i,n)/i,个数就是n/len=gcd(i,n);如果是翻转,奇数个点对称轴就是一个点一条边,那么循环节个数即n/2+1,
偶数个点有n/2条对称轴穿过两个点,循环节个数是n/2+1,n/2条对称轴穿过两条边,循环节个数就是n/2,然后直接套polya公式即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 8 int n,m; 9 10 int gcd(int a,int b){11 return b==0?a:gcd(b,a%b);12 }13 14 long long power(int a,int k){15 if (k==0) return 1;16 if (k==1) return a;17 int x=power(a,k/2),ans=x*x;18 if (k&1) ans*=a;19 return ans;20 }21 22 int main(){23 while (scanf("%d%d",&m,&n)!=EOF){24 if (n==0 && m==0) break;25 long long ans=0;26 for (int i=1;i<=n;i++) ans+=power(m,gcd(n,i));27 if (n&1) ans+=n*power(m,n/2+1);else ans+=n/2*power(m,n/2)+n/2*power(m,n/2+1);28 printf("%lld\n",ans/(n*2));29 }30 }
zoj1873 Let it Bead
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。