zoukankan      html  css  js  c++  java
  • poj2409&&poj1286

     题目意思:都是给定m个颜色,然后去个长度为N的项链染色,无其他限制。

                  然后反转,顺时针旋转算是一种方案啊

    思路:比较基础的polya题目,算是模板题吧。。

         1)旋转 将项链旋转i格,循环个数为gcd(N,i)

         2)反转:

              A.n为奇数时,共有 n个循环节数为(n+1)/2的循环群

              B、n为偶数,可以根据一条边及一个点对称,有n/2 个循环节数为(n+2)/2的循环群

                               还可以根据两个点对称,有n/2个循环节数为n/2的循环群

    code:

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cstdio>
     5 #include <cmath>
     6 #include <algorithm>
     7 
     8 typedef __int64 LL;
     9 using namespace std;
    10 __int64 n, m, gcd[30][30];
    11 
    12 void init(){
    13   for (int i = 1;i <= 24; ++i)   
    14     for (int j = 1; j <= 24; ++
    15     j) 
    16       for (int k = 1; k <= min(i,j); ++k)
    17        if (j % k == 0 && i % k ==0) gcd[i][j] = k;
    18      
    19 }
    20 
    21 void solve(){
    22     LL sum = 0; 
    23     if (n == 0){
    24           printf("%d\n", 0);
    25           return ;
    26     }
    27     for (int i = 1; i <= n;  ++i)
    28             sum += (LL)( pow( m * 1.0, gcd[i][n] * 1.0));
    29     if (n&1){
    30           sum += (LL)( n* pow(m * 1.0, (n  + 1)/ 2.0));
    31     } else {
    32           sum += (LL)((n / 2) *  pow(m *1.0, (n + 2) / 2 * 1.0));
    33           sum += (LL)((n / 2) *  pow(m *1.0, n / 2 * 1.0));
    34     }
    35     printf("%lld\n", sum / (2 * n));
    36     
    37 }
    38 
    39 int main(){
    40      freopen("poj1286.in", "r", stdin);
    41      freopen("poj1286.out","w", stdout);
    42      init();
    43      m = 3;
    44      while (scanf("%lld", &n) != EOF && n != -1)
    45         solve();
    46 }

    code2:

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cstdio>
     5 #include <cmath>
     6 #include <algorithm>
     7 
     8 typedef __int64 LL;
     9 using namespace std;
    10 __int64 n, m, gcd[34][34];
    11 
    12 void init(){
    13   for (int i = 1;i <= 33; ++i)   
    14     for (int j = 1; j <= 33; ++
    15     j) 
    16       for (int k = 1; k <= min(i,j); ++k)
    17        if (j % k == 0 && i % k ==0) gcd[i][j] = k;
    18      
    19 }
    20 
    21 void solve(){
    22     LL sum = 0; 
    23     if (n == 0){
    24           printf("%d\n", 0);
    25           return ;
    26     }
    27     for (int i = 1; i <= n;  ++i)
    28             sum += (LL)( pow( m * 1.0, gcd[i][n] * 1.0));
    29     if (n&1){
    30           sum += (LL)( n* pow(m * 1.0, (n  + 1)/ 2.0));
    31     } else {
    32           sum += (LL)((n / 2) *  pow(m *1.0, (n + 2) / 2 * 1.0));
    33           sum += (LL)((n / 2) *  pow(m *1.0, n / 2 * 1.0));
    34     }
    35     printf("%I64d\n", sum / (2 * n));
    36     
    37 }
    38 
    39 int main(){
    40      freopen("poj2409.in", "r", stdin);
    41      freopen("poj2409.out","w", stdout);
    42      init();
    43      while (scanf("%I64d%I64d", &m, &n) != EOF && n != 0 && m != 0)
    44         solve();
    45 }
  • 相关阅读:
    JAVA学习之常用集合List,Set,Map
    【收藏】SQL多行变一列
    sql 多个字段分组,删除重复记录,保留ID最小的一条
    【转】 JavaScript:history.go() 的妙用(转) 处理post回发后返回
    【转】SQL SERVER 2005中如何获取日期(一个月的最后一日、上个月第一天、最后一天、一年的第一日等等)
    require.context实现自动化导入文件
    Vue进阶——解析V-MODEL
    ES6 的遍历器接口 Iterator
    必须掌握的ES6新特性
    Vue自定义指令获取DOM元素
  • 原文地址:https://www.cnblogs.com/yzcstc/p/3060459.html
Copyright © 2011-2022 走看看