POJ 1286 【POLYA】

题意:

给你三种颜色的珠子,每次给你N,问在旋转,翻转之后视作相同的情况下,能组成多少种不同的项链。

思路:

让我们借这道题拯救一下我对POLYA定理的理解...

sigma(m^(gcd(i,n)))

以上是在旋转的时候计数的和,其中m是颜色的数量,n是项链的长度。

一下考虑翻转的情况:

当n是偶数的时候,

有n/2种情况循环节的数量是n/2+1,有n/2种情况是n/2。

当n是奇数的时候,

有n种情况是循环节的数量是n/2+1

别忘了最后要除以循环节总的种类数!!!

坑点:

这题n可能等于0...

RE了一次...

#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
long long quick_pow(long long a,long long b){
    long long rel=1;
    while(b){
        if(b&1)rel*=a;
        a=a*a;
        b>>=1;
    }
    return rel;
}
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n>=0){
        if(n==0){printf("0\n");scanf("%d",&n);continue;}
        long long ans=0;
        for(int i=1;i<=n;i++){
            ans+=quick_pow(3,gcd(n,i));
        }
        if(n&1){
            ans+=n*quick_pow(3,n/2+1);
        }
        else{
            ans+=n/2*quick_pow(3,n/2+1);
            ans+=n/2*quick_pow(3,n/2);
        }
        printf("%I64d\n",ans/n/2);
        scanf("%d",&n);
    }
}
时间: 2024-10-13 11:54:09

POJ 1286 【POLYA】的相关文章

POJ 2154 【POLYA】【欧拉】

前记: TM终于决定以后干啥了.这几天睡的有点多.困饿交加之间喝了好多水.可能是灌脑了. 切记两件事: 1.安心当单身狗 2.顺心码代码 题意: 给你N种颜色的珠子,串一串长度问N的项链,要求旋转之后重合的算是同一种项链.问一共有多少中可能.结果模p. 1 <= N <= 1000000000, 1 <= P <= 30000 思路: 首先是我们的POLYA定理,给定的公式是这样的sigma(N^gcd(N,i))/N   i从0到N-1. 然后是优化的问题.因为如果我们枚举i累加

POJ1026 Cipher 【polya】

This question is not so difficult. First,my thoughts were we should use a lot of code to find out the loop block,but there is no need to do that . you just need to get every new position of char in the string. Algorithm is also easy , just like how d

POJ3270 cow sorting 【polya】

题目描述: 给你一个数字序列(每个数字唯一),每次你可以交换任意两个数字,代价为这两个数字的和,问最少用多少代价能把这个序列按升序排列好. 题目的具体做法是参考刘汝佳的<算法艺术与信息学奥赛>大概思路是:以后再用别种方法解, 1.找出初始状态和目标状态.明显,目标状态就是排序后的状态. 2.画出置换群,在里面找循环.例如,数字是8 4 5 3 2 7 明显,                                   目标状态是2 3 4 5 7 8,能写为两个循环:(8 2 7)(4

POJ 2411【题解】Mondriaan&#39;s Dream 状压DP

题目链接:http://poj.org/problem?id=2411 把每一行当作一个二进制状态. 1表示是一个竖着的1*2的方格. 0表示其他状态. 那么显然当i-1的状态k能转移到i的j: 1.j 和 k 的按位与为0.(有1必须要0,0也可以有1) 2.j 和 k 按位或每一段0都有偶数个.(表示横着的长方形) 那么就可以预处理一下合格的点. 然后状压DP. 代码如下: #include<cstdio> using namespace std; int n,m; long long f

poj Wormholes 【最短路径】【bellman_ford】

Wormholes Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wor

POJ 3230 【DP】

题意: 某货旅行,在n个城市呆m天. 给出从第i个城市到第j个城市的路费,或者留在某个城市的生活费. 给出在第i天在第j个城市的收益. 可以在城市之间任意穿梭逗留没有其他特殊要求. 求收益最大是多少. 思路: dp[i][j]代表这货在第i天在第j个城市的最大收益. 然后状态转移方程是dp[i][j]=max(dp[i-1][1..n]+枚举目标城市计算收益)[这里少写了目标城市的那层循环,一共三层循环] #include<stdio.h> #include<string.h> #

Wormholes POJ 3259【SPFA】

http://poj.org/problem?id=3259 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFOR

poj 1286&amp;&amp;poj2409 Polya计数 颜色匹配

#include <iostream> #include <math.h> using namespace std; #define LL long long LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } LL polya(LL n) { LL ret = 0; for(LL i = 0; i < n; i++) ret += pow(3, gcd(i, n)); //flip them... if( n &

poj 2385【动态规划】

poj 2385 Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14007   Accepted: 6838 Description It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his