polya的精髓就在与对循环节的寻找,其中常遇到的问题就是项链染色类问题。

当项链旋转时有n种置换,循环节的个数分别是gcd(n, i);

当项链翻转时有n种置换,其中当项链珠子数位奇数时,循环节的个数是n/2+1

当项链珠子数是偶数个时,当翻转线穿过珠子时,循环节个数为n/2+1,否则为n/2;

1.poj 1286:

题目大意:用三种颜色对珠子数不超过24的项链染色,问有多少种染色情况。

这道题是最基本的polya定理考察,只要带入公式即可

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const long long maxa = ;
long long edge[maxa];
void rotate(long long n, long long ii){
for(long long i = ; i < n; i++){
edge[(i+ii)%n] = i;
}
}
void turn(long long n, long long ii){
for(long long i = n-, j= ; i >= ; i--, j++){
edge[(j+ ii)%n] = i;
}
}
long long vis[maxa];
void dfs(long long i){
if(vis[i] == )return ;
vis[i] = ;
dfs(edge[i]);
}
int main(){
int n, m;
while(scanf("%d%d", &m, &n), n+m){
if(n == ){
printf("0\n");
continue;
}
long long ans = ;
for(long long i = ; i < n; i++){
rotate(n, i);
long long o = ;
memset(vis, , sizeof(vis));
for(long long k = ;k < n; k++){
if(vis[k]==){
o ++;
dfs(k);
}
}
long long sum = ;
for(long long k = ;k < o; k++){
sum *= m;
}
ans += sum;
}
for(long long i = ; i < n; i++){
turn(n, i);
long long o = ;
memset(vis, , sizeof(vis));
for(long long k = ;k < n; k++){
if(vis[k]==){
o ++;
dfs(k);
}
}
long long sum = ;
for(long long k = ;k < o; k++){
sum *= m;
}
ans += sum;
}
cout<<ans/n/<<endl;
}
}

2.poj 2409

题目大意,用c种颜色染n个珠子组成的项链,也是最基本的polya定理考察

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const long long maxa = ;
long long edge[maxa];
void rotate(long long n, long long ii){
for(long long i = ; i < n; i++){
edge[(i+ii)%n] = i;
}
}
void turn(long long n, long long ii){
for(long long i = n-, j= ; i >= ; i--, j++){
edge[(j+ ii)%n] = i;
}
}
long long vis[maxa];
void dfs(long long i){
if(vis[i] == )return ;
vis[i] = ;
dfs(edge[i]);
}
int main(){
int n, m;
while(scanf("%d%d", &m, &n), n+m){
if(n == ){
printf("0\n");
continue;
}
long long ans = ;
for(long long i = ; i < n; i++){
rotate(n, i);
long long o = ;
memset(vis, , sizeof(vis));
for(long long k = ;k < n; k++){
if(vis[k]==){
o ++;
dfs(k);
}
}
long long sum = ;
for(long long k = ;k < o; k++){
sum *= m;
}
ans += sum;
}
for(long long i = ; i < n; i++){
turn(n, i);
long long o = ;
memset(vis, , sizeof(vis));
for(long long k = ;k < n; k++){
if(vis[k]==){
o ++;
dfs(k);
}
}
long long sum = ;
for(long long k = ;k < o; k++){
sum *= m;
}
ans += sum;
}
cout<<ans/n/<<endl;
}
}

3.hdu 1812

题目大意,用c种颜色对n*n的棋盘染色,有多少种方法

其实这道题就是可以看成一些(n+1)/2串项链,有八种置换,但是最坑的是大数怎么写都超时....万进制优化也超时.....打表还不让大那么大,java是很好的解决方法...谁爱写谁写....反正我不写啦啦啦啦

4.poj 2154

题目大意,用n种颜色染长度是n的项链,结果mod p n<=10^9,p<= 30000,这里的项链只考虑旋转。

常规解法是这样sum(n^gcd(n,i))%q,但是数据太大了不允许,我们知道的是n的因子数是可以通过搜索求出来的,那么如果gcd(n,i) == m,则i的数量显然是euler(i),需要注意的是最后除n的时候,n和p不一定互质所以需要在之前做处理,也就是将公式变成了sum(n^gcd(n,i)-1)%q,需要注意的是开long long会超时,所以在要用int,有些部分需要用同余模定理优化。

#include<iostream>
#include<string.h>
#include<cmath>
#include<stdio.h>
using namespace std;
const int maxa = ;
int app[maxa][];
int o;
int ans;
int n, q;
int m;
int euler(int n){ //返回euler(n)
//if(n == 1)return 0;
int res=n,a=n;
for(int i=;i*i<=a;i++){
if(a%i==){
res=res/i*(i-);//先进行除法是为了防止中间数据的溢出
while(a%i==) a/=i;
}
}
if(a>) res=res/a*(a-);
return res;
}
int kuick(int a, int b){
int aa = ;
if(b == )return ;
aa = kuick(a, b/);
aa *= aa;
aa%= q;
if(b &) aa*= a;
aa %= q;
return aa;
}
void dfs(int ii, int nn){//cout<<"*"<<ii<<" "<<o<<" "<<nn<<endl;
if(ii == o){
int aa = euler(n/nn) % q;
ans += aa * kuick(n%q, nn-);
ans %= q;
return;
}
dfs(ii+, nn);
int ss = ;
for(int i = ; i < app[ii][]; i++){
ss *= app[ii][];
dfs(ii+, ss*nn);
}
}
int main(){
cin>>m;
while(m--){
cin>>n>>q;
int N = n;
ans = ;
int sq = sqrt(n);
o = ;
for(int i = ;i <= sq; i++){
if(n % i == ){
app[o][] = i;
app[o][] = ;
while(n %i ==){
app[o][]++;
n /= i;
}
o++;
}
}
//printf("*");
if(n != ){
app[o][] = n;
app[o++][] = ;
}
n = N;
dfs(, );
cout<<ans<<endl;
}
}

polya定理小结的更多相关文章

  1. 【转】Polya定理

    转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...

  2. 【群论】polya定理

    对Polya定理的个人认识     我们先来看一道经典题目:     He's Circles(SGU 294)         有一个长度为N的环,上面写着“X”和“E”,问本质不同的环有多少个(不 ...

  3. [wikioi2926][AHOI2002]黑白瓷砖(Polya定理)

    小可可在课余的时候受美术老师的委派从事一项漆绘瓷砖的任务.首先把n(n+1)/2块正六边形瓷砖拼成三角形的形状,右图给出了n=3时拼成的“瓷砖三角形”.然后把每一块瓷砖漆成纯白色或者纯黑色,而且每块瓷 ...

  4. HDU 3923 Invoker(polya定理+逆元)

    Invoker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 122768/62768 K (Java/Others)Total Su ...

  5. Polya定理

    http://www.cnblogs.com/wenruo/p/5304698.html 先看 Polya定理,Burnside引理回忆一下基础知识.总结的很棒. 一个置换就是集合到自身的一个双射,置 ...

  6. POJ 2409 Let it Bead(Polya定理)

    点我看题目 题意 :给你c种颜色的n个珠子,问你可以组成多少种形式. 思路 :polya定理的应用,与1286差不多一样,代码一改就可以交....POJ 1286题解 #include <std ...

  7. POJ 1286 Necklace of Beads(Polya定理)

    点我看题目 题意 :给你3个颜色的n个珠子,能组成多少不同形式的项链. 思路 :这个题分类就是polya定理,这个定理看起来真的是很麻烦啊T_T.......看了有个人写的不错: Polya定理: ( ...

  8. 百练_2409 Let it Bead(Polya定理)

    描述 "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you ca ...

  9. HDU 4633 Who's Aunt Zhang (Polya定理+快速幂)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4633 典型的Polya定理: 思路:根据Burnside引理,等价类个数等于所有的置换群中的不动点的个 ...

随机推荐

  1. MVC模式下xml文件的解析

    第一次写blog,组织不当和出错的地方还请大家多担当哈. java操作xml文件的方式中用的较多的有四种,DOM.SAX.JDOM.DOM4J.除第一种外其余的三种我都有试过,这后三种方案中我选择用S ...

  2. QQ原创表情添加

    有时候与QQ好友聊天时会收到一些自己比较喜欢的原创表情,如果我们想把这些QQ不支持直接保存的原创表情保存到电脑上该怎么做呢?我们以原创表情图片为例简单介绍一下. 首先,先建立一个存放表情图片的文件夹. ...

  3. DEDE提高生成HTmL的速度

    1.找到include/inc/inc_fun_SpGetArcList.php打开之.   2.查找以下代码:   for($i=0;$i<$ridnum;$i++){     if($tps ...

  4. lucene分词多种方法

    目前最新版本的lucene自身提供的StandardAnalyzer已经具备中文分词的功能,但是不一定能够满足大多数应用的需要.另外网友谈的比较多的中文分词器还有:CJKAnalyzerChinese ...

  5. iOS-OC命名规范

    IOS开发(OC)中的命名规范 正文:通过读写大量代码我有自己的一套编程思路和习惯,自认为自己的编码习惯还是不错的,代码结构也算清晰,因为我一直以来都是代码看的多写的多,但是总结的比较少,知识经常不成 ...

  6. 『软件介绍』SQLServer2008 基本操作

    0x 01 连接数据库 Win7下,先打开SQLServer管理工具(开始菜单/所有程序/Microsoft SQL Server 2008/SQL Server Management Studio) ...

  7. git操作的各种命令整理

    1.常用的Git命令   命令 简要说明 git add 添加至暂存区 git add–interactive 交互式添加 git apply 应用补丁 git am 应用邮件格式补丁 git ann ...

  8. yiic模块module使用

    模块是一个独立的软件单元,它包含 模型, 视图, 控制器 和其他支持的组件. 在许多方面上,模块看起来像一个 应用.主要的区别就是模块不能单独部署,它必须存在于一个应用里. 用户可以像他们访问普通应用 ...

  9. ORACLE表空间

    在ORACLE数据库中,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段.区.块等逻辑结构.从物理结构上看是放在数据文件中.一个表空间可由多个数据文件组成. 如下图所示,一个数据库由对应 ...

  10. switchover和failover

    Dataguard中primary和standby间的角色切换包括两种:1. switchoverprimary和standby互换角色,一般都是人为的有计划的,主要用于主机或数据库的升级,不会有数据 ...