zoukankan      html  css  js  c++  java
  • 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
    ",ans/(n*2));
    29     }
    30 } 
    View Code
  • 相关阅读:
    day35作业
    进程的初识
    day34作业
    python中的文件
    python字典概述
    python中的深拷贝与浅拷贝
    python的元组和列表使用之一
    Python基本数据类型
    python的编码
    windows中安装python
  • 原文地址:https://www.cnblogs.com/DUXT/p/5947457.html
Copyright © 2011-2022 走看看