Polya定理及例题

组合数学|置换群乘法|Polya定理例题【解题思路】 讲解了群的置换乘法、polya定理应用例题的解题思路。 阅读详情
  • 概念

先讲Burnside定理:

百度百科的传送门:https://baike.baidu.com/item/burnside%E5%BC%95%E7%90%86/1505996

 再放一个例题:

 

 重点还是Polya定理

百度百科的传送门:https://baike.baidu.com/item/Polya/11020869

Polya定理在Burnside定理的基础上增加了 翻转 得到更大的置换群

( )内表示的是 循环节

关于定理概念也可以看看这篇博客:https://blog.youkuaiyun.com/lyc1635566ty/article/details/52545355

 

Necklace of Beads

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 9432 Accepted: 3887

Description

Beads of red, blue or green colors are connected together into a circular necklace of n beads ( n < 24 ). If the repetitions that are produced by rotation around the center of the circular necklace or reflection to the axis of symmetry are all neglected, how many different forms of the necklace are there? 

 

Input

The input has several lines, and each line contains the input data n. 
-1 denotes the end of the input file. 

Output

The output should contain the output data: Number of different forms, in each line correspondent to the input data.

Sample Input

4
5
-1

Sample Output

21
39

题目大意:

输入n,得到由红,绿,蓝三种颜色珠子串成的长度为n的项链有多少种。

(输入为 -1 时结束程序)

【因为 项链是一个圈 是可以翻转旋转的 所以用Polya定理做】 

放代码

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#define LL long long
using namespace std;
//Polya定理 置换群
LL gcd(LL a,LL b)//计算最大公约数
{
    if (b==0)
        return a;
    return gcd(b,a%b);
}
int main()
{
    LL t;
    while (~scanf("%lld",&t))
    {
        LL sum=0;
        if (t==-1)break;
        if (t==0)//特殊判断 输入0输出0
        {
            printf("0\n");
            continue;
        }
        for (int i=1;i<=t;++i)
        {
            LL tmp=gcd(t,i);
            sum+=(LL)(pow(3.0,tmp*1.0));//位置不变时 所有的点都有三种情况
        }
        if (t%2==1)//判断t的奇偶
            sum+=(t*pow(3.0,(t+1)/2));//奇数情况下 置换造成的情况数量相同
        else//偶数情况时
        {
            sum+=(LL)((t/2)*pow(3.0,(t+2)/2.0));//对角线对称翻转
            sum+=(LL)((t/2)*pow(3.0,t/2));//对边对称翻转
        }
       sum=sum/(2*t);
       printf("%lld\n",sum);
    }
    return 0;
}

 

Let it Bead

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 6487 Accepted: 4339

Description

"Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you can deduce from the company name, their business is beads. Their PR department found out that customers are interested in buying colored bracelets. However, over 90 percent of the target audience insists that the bracelets be unique. (Just imagine what happened if two women showed up at the same party wearing identical bracelets!) It's a good thing that bracelets can have different lengths and need not be made of beads of one color. Help the boss estimating maximum profit by calculating how many different bracelets can be produced. 

A bracelet is a ring-like sequence of s beads each of which can have one of c distinct colors. The ring is closed, i.e. has no beginning or end, and has no direction. Assume an unlimited supply of beads of each color. For different values of s and c, calculate the number of different bracelets that can be made.

Input

Every line of the input file defines a test case and contains two integers: the number of available colors c followed by the length of the bracelets s. Input is terminated by c=s=0. Otherwise, both are positive, and, due to technical difficulties in the bracelet-fabrication-machine, cs<=32, i.e. their product does not exceed 32.

Output

For each test case output on a single line the number of unique bracelets. The figure below shows the 8 different bracelets that can be made with 2 colors and 5 beads.

Sample Input

1 1
2 1
2 2
5 1
2 5
2 6
6 2
0 0

Sample Output

1
2
3
5
8
13
21

题目大意:

每一行输入 e 和 s 求出 能由 e 种不同颜色的珠子串成的长度为 s 的手镯有多少种。

输入e=0且s=0时 结束程序

【注解中解释了gcd函数的作用】

放代码

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#define  LL long long
using namespace std;
//Polya定理

LL gcd(LL a,LL b)//最大公约数 greatest common divisor
{
    if (b==0)return a;
    return gcd(b,a%b);
}
//考虑旋转:枚举旋转角度360/n*i,(0<i<=n),也就是一个置换。经过该置换,颜色仍保持不变的着色方案有k^GCD(n,i)种。
//一个长度为n的环,每i个上同一种颜色,可以上多少种颜色。
//假设起点在x,则x,x+i,x+2*i,……,x+k*i,……
//假设在第t次,第一次回到起点,则x=(x+t*i)%n => t*i%n=0 => t=LCM(i,n)/i=n*i/GCD(n,i)/i=n/GCD(n,i)。
//那么可以上n/t种颜色,即n/(n/GCD(n,i))种,所以旋转的着色方案有k^GCD(n,i)种
int main()
{
    LL  n,q,k;
    while (~scanf("%lld%lld",&k,&n)&&k&&n)
    {
        LL ans=0;
        for (int i=1; i<=n; i++)
        {
            LL tmp=gcd(n,i);
            ans+=(LL)(pow(k,tmp*1.0));//位置不变时 所有的点都有k种情况
        }
        if (n%2==1)//判断t的奇偶
            ans+=(LL)(n*pow(k,(n+1)/2));//奇数情况下 置换造成的情况数量相同
        else//偶数情况时
        {
            ans+=(LL)((n/2)*pow(k,(n+2)/2.0));//对角线对称翻转
            ans+=(LL)((n/2)*pow(k,n/2));//对边对称翻转
        }
        ans=ans/(2*n);
        printf("%lld\n",ans);
    }
    return 0;
}

 

Color

Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 11725 Accepted: 3775

Description

Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of the necklace can be produced. You should know that the necklace might not use up all the N colors, and the repetitions that are produced by rotation around the center of the circular necklace are all neglected. 

You only need to output the answer module a given number P. 

Input

The first line of the input is an integer X (X <= 3500) representing the number of test cases. The following X lines each contains two numbers N and P (1 <= N <= 1000000000, 1 <= P <= 30000), representing a test case.

Output

For each test case, output one line containing the answer.

Sample Input

5
1 30000
2 30000
3 30000
4 30000
5 30000

Sample Output

1
3
11
70
629

题目大意:

第一行给出 X 之后输入X组 N 和 P

求出 至多用N种(可以少于N) 考虑旋转 不考虑翻转 构成长度为 P 的项链的数量

【只有旋转 则用Burnside定理】

PS:因为数据太大 不能用gcd函数实现 所以用欧拉函数优化

借鉴了别人的博客...因为第一次写的时候没有优化 连样例都过不去

参考:https://www.cnblogs.com/DrunBee/archive/2012/09/10/2678819.html

           https://blog.youkuaiyun.com/wsniyufang/article/details/6671122

放代码

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
//Polya定理 欧拉函数优化
//题目数据太大 不能用gcd
const int MAXN=1000000000;
int isprime[50001];
int prime[8001];
int num,n,p;
void getprime()//得到素数
{
    num=0;
    for(int i=2; i<=50000; i++)
        if(!isprime[i])
        {
            prime[num++]=i;
            for(int j=1; j*i<=50000; j++)
            {
                isprime[i*j]=1;
            }
        }
}
int euler(int x)//获得比n小的且与n互质的数的数目
{
    int res=x;
    for(int i=0; i<num&&prime[i]*prime[i]<=x; i++)
    {
        if(x%prime[i]==0)
        {
            res=res/prime[i]*(prime[i]-1);
            while(x%prime[i]==0)
            {
                x/=prime[i];
            }
        }
    }
    if(x>1) res=res/x*(x-1);
    return res;
}
int expmod(int a,int b,int mod)//每次做幂级数运算都要取模操作
{
    int ret=1;
    a=a%mod;
    while(b>0)
    {
        if(b%2==1)
            ret=(ret*a)%mod;
        a=(a*a)%mod;//二分思想
        b=b/2;
    }
    return ret;
}

int main()
{
    int Case;
    getprime();
    scanf("%d",&Case);
    while(Case--)
    {
        scanf("%d%d",&n,&p);
        int ans=0,i;
        for(i=1; i*i<n; i++)if(n%i==0)
            {
                ans=(ans+euler(i)%p*expmod(n,n/i-1,p)+euler(n/i)%p*expmod(n,i-1,p))%p;
                //这里的i-1代表已经除以整个置换数n了,原本是expmod(n,i),最后要除以n的,
            }
        if(i*i==n)
            ans=(ans+euler(i)*expmod(n,i-1,p))%p;
        printf("%d\n",ans);
    }
    return 0;
}

以后如果做到此类题目 还会来更新的......

【群论相关】Burnside引理&Polya定理 群: 置换 不动点&amp;amp;amp;amp;amp;amp;amp;等价类 Burnside引理 Polya定理 例题 poj2154-Color 引用 关于群论中置换,集合之间的关系,知乎如何直观地理解群论?写得挺好。 群: 由一个集合GGG和一个运算⋅·· 构成,运算过程即为集合中任何两个元素a,ba,ba,b,a⋅ba·ba·b的过程,运算⋅··为具体给出的任意一种可行的运算,需 阅读详情

相关推荐

Polya定理Polya定理Polya定理

Pólya原理是组合数学中,用来计算全部互异的组合状态的个数的一个十分高效、简便的工具。下面,我就向大家介绍一下什么是Pólya原理以及它的应用。请先看下面这道例题:

【组合数学】Pólya 计数理论

Pólya 计数理论与Burnside 引理介绍及应用。

恭仔的博客 4518

Polya定理以及知识点详解

Pólya原理是组合数学中,用来计算全部互异的组合状态的个数的一个十分高效、简便的工具。下面,我就向大家介绍一下什么是Pólya原理以及它的应用。请先看下面这道例题: 【例题1】 对2*2的方阵用黑白两种颜色涂色,问能得到多少种不同的图像?经过旋转使之吻合的两种方案,算是同一种方案。 【问题分析】

Polya定理

  在着色问题上常常用到Polya 定理来解决计数问题,是组合数学的基本定理之一 .   首先先引入置换群 ,              设 S = { 1,2,3...n} , S 上的任何双射函数  : S -&gt; S 称为 S 上的 n 元置换 .  可以表示成这样.           设  是 S = {1,2,3 .... . n } 上的n元置换 . 若  (i1) ...

森宝的博客 1万+

SAP交货单过账避坑指南:序列号处理、Buffer清理与BAPI提交回滚的那些事儿

本文深入解析SAP交货单过账中的序列号处理、Buffer清理与BAPI提交回滚等关键问题,提供WS_DELIVERY_UPDATE和BAPI_OUTB_DELIVERY_CONFIRM_DEC的实战优化方案。通过详细的技术分析和最佳实践,帮助开发者避免常见陷阱,提升交货单处理的稳定性和效率。

weixin_31155097的博客 431

Exposure Fusion

MertensTMO原理详解: 文章:2007年Exposure Fusion 论文链接:http://ntp-0.cs.ucl.ac.uk/staff/j.kautz/publications/exposure_fusion.pdf 论文代码:C版本:https://github.com/JawThrow/ExposureFusion python版本:https://github.com/lzocro/Exposure-Fusion matlab版本:https://github.com/Mericam

大长腿不解释 1652

Polya定理相关题目解题方式总结(补轴上 有不变元素)

首先,这些题目都是围绕着Polya公式的题目展开的一些变形,往题上加难度的方式无非就是: 1. 增加找置换的循环节的难度--比如立体的轴对称图形,立方体等等。 2. 在颜色数目上加限制。 3. 对颜色使用上加限制,比如颜色a和颜色b不能在一起用。 4. 例题图形转轴上有不动的元素   基本上难点都在上述四点上,而且目前还没有见过把2,3放在一起的题,如果真的有,目前的我也不会处理,因为3

m0_37772713的博客 722

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

执行命令: make -j 4 && make install 这里要等待一段时间,等待编译完成。执行命令: ./configure --prefix=/usr/local/src/zlilb。执行命令: ./config --prefix=/usr/local/src/openssl。执行命令: make -j 4 && make test && make install。执行命令: make -j 4 && make install。执行命令: /etc/init.d/sshd restart。

X_yufei的博客 7428

polya定理例题讲解

群polya定理题目 polya定理 题目 一个2*2的方格,在4个方块中选2个涂色,求总方案数? 第一步:n=4,m=2,M为方案数 第二步:求置换群:(1),(13)(24),(1234),(1432) 第三步: (1):m^4=16 ,4代表置换群(1)中的轮换个数为4 (13)(24):m^2=4 (1234):m^1=2 (1432):m^1=2 M=1/n * (16+4+2+2)=6(种方案) ...

xiaomayi____的博客 851

ISP-全局色调映射(GTM)算法简单实现

色调映射算法,色彩空间转换LAB

notgoodenouf的博客 2239

扩视机器视觉—Halcon机器视觉48个实战项目六(检测定位角度)

此项目halcon检测检测定位角度问题,并显示。

qq_21516871的博客 1093

Poly定理:学习笔记

Polya 定理 Redfield-Polya (Pólya enumeration theorem,简称PET)定理是组合数学理论中最重要的定理之一。 其提出者波里亚在众多数学的分支:函数论、变分学、概率论、数论、组合数学以及计算数学和应用数学领域中,都颇有建树,他共发表了200多篇著名论文,以他的名字命名的Polya计数定理,则是近代组合数学的重要工具。波里亚还是杰出的数学教育家,有...

weixin_30699741的博客 903

漫画安全HIDS、EDR、NDR、XDR

漫画安全HIDS、EDR、NDR、XDR

墨痕诉清风的博客 3445

组合数学实战:置换群乘法与Polya定理经典例题解析

本文深入解析组合数学中的置换群乘法与Polya定理,通过等边三角形着色和四珠项链问题等经典例题,详细演示如何应用这些理论解决实际问题。文章特别强调置换群乘法的顺序效应和Polya定理的具体计算步骤,帮助读者掌握组合数学的核心技巧。

weixin_30300225的博客 426

SAP 采购员参数及权限配置

若要控制采购员的参数缺省值或者权限,可以通过以下方式实现: 1、定义采购员缺省值(EVO) 路径:后台----物料管理---采购---环境数据---定义采购员的缺省值 点击图标,显示如下,查看参数配置ID: 查询到配置“定义采购员的缺省值”是通过ID “EVO”来配置的。进入页面建立配置: 按照需要配置新条目: 事务代码SU01进入用户配置页面,在用户“参数”页面配置前面设...

willieyuan的博客 7600

芒果YOLOv5改进55:损失函数篇之KLD:即插即用 芒果首发原创新颖|全网唯一更新KLD改进博客,通过 Kullback-Leibler 散度学习用于目标检测的高精度边界框,提升YOLOv5小目标

YOLOv5改进KLD损失函数:即插即用 原创新颖|芒果专栏独家首发

包括YOLOv5、YOLOv7、YOLOv8等模型改进 663

Polya计数 学习笔记

置换 基本概念 置换是相对与群(当然我们讨论的是有限群= =)而言的一种操作。 通常我们这样来表示 (1a12a23a3⋯⋯nan)(123⋯na1a2a3⋯an) \left( \begin{matrix} 1 & 2 & 3 & \cdots & n\\ a_1 & a_2 & a_3 & \cdots & a_n \end{matrix} \right) 它的意义是对于新的排...

Rayment的博客 833

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Polya定理,Burnside引理

涉及到组合数学的问题,首先是群的概念: 设G是一个集合,*是G上的二元运算,如果(G,*)满足下面的条件: 封闭性:对于任何a,b∈G,有a*b∈G; 结合律:对任何a,b,c∈G有(a*b)*c=a*(b*c); 单位元:存在e∈G,使得对所有的a∈G,都有a*e=e*a=a; 逆元:对于每个元素a∈G,存在x∈G,使得a*x=x*a=e,这个时候记x为a-1,称为a的逆元,那么则称(

许增强 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

polya 计数法,burnside定理 学习小结

polya 计数法,burnside定理 学习小结 转载自:http://hi.baidu.com/%B1%BF%D0%A1%BA%A2_shw/blog/item/89fd091055caf51db9127bc8.html 记得最早接触这类题目还是去年这个时候,当时看了点书,做了几个水题,就以为自己懂了。 后来发现自己还是根本没有理解。最近简单复习了下,又做了几道相关的题目

Stay hungry,stay foolish! 1044

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

BZOJ 1004 Card(Burnside)+BZOJ 1815 有色图(Polya)

先来写一写什么是置换群和Burside、Polya。 关于置换群、Burnside和Polya 一、一些概念 1、群:对于一个集合G={a,b,c,…}和G上的二元运算*,满足①封闭性②结合律③单位元④逆元,则称:集合G在运算’*’之下是一个群 2、置换群:置换群的元素是置换,运算是置换的连接 3、ZkZkZ_k (K不动置换类):设G是1~n的置换群,若K是1~n中的某个元素...

XHRlyb的博客 592

【知识总结】Polya 定理

我第一次听说 Polya 原理是 NOIP2017 以前,但我觉得太难想着以后再学; NOIP2018 以前我觉得会考这玩意,下定决心学,后来咕了; WC2019 以前我觉得会考这玩意,下定决心学,后来咕了; SNOI2019 以前我觉得会考这玩意,下定决心学,后来咕了; CTS2019 以前我觉得会考这玩意,下定决心学,后来咕了; APIO2019 以前我觉得会考这玩意,下定决心学,后来咕了; ...

weixin_30663471的博客 284

【算法专题】置换群——burnside引理、polya定理

今天朋友问我一道题 一条含有N个珠子的项链,每个珠子都有t种不同的染色。旋转、翻折后相同的项链视为 一种。问有多少本质不同的项链。 想起高中学数学竞赛看《奥赛经典》群置换时遇到过相似的题,遂复习了一下,学习了burnside引理和polya定理,获颇丰。 先总结一下burnside引理和polya定理应用场景(我遇到的) 经过置换(翻折、旋转)可视为同一种情形下的求染色方案数问题 网上看到一个介绍burnside引理和polya定理的博客,觉得自己写也无出其右了,便转载过来(真实原因:不会作图+懒)

hhhenjoy的博客 509

关于数论【polya计数法】

可以预见数论推公式是有多么蛋疼。 让我简明扼要的讲讲吧(多都说不出来,毕竟才做了两道题)其实呢,这个算法应该归入群论,有个有用的东西:置换群,它表示一个集合包括很多的置换。先讲讲置换吧:↓(这是个置换)1 2 3 43 1 2 4怎么个置换法呢?这个就代表,第1个状态置换后变成第3个状态,第2个状态置换后变成第1个状态,第3个状态置换后变成第2个状态,第4个状态置换后变成第4个状态。然后就是循环...

weixin_30782293的博客 91

初学polya

一篇比较好的论文:http://wenku.baidu.com/link?url=KSN5ZBbKMsHr17dRdMIXnXQHi0HLMM8cRhC2d32zFmHFk3LF288Y9h50yIQCBNnkgeAPFM0iC1Y8HT-TyLK-wTaQq-eW5WV3UU4tHKBjLAW 基本定理 :     1,burnside引理: Ans=(D(1)+D(2)+...D(G))/

jzhang1的专栏 691

置换群和Burnside引理,Polya定理

定义简化版: 置换,就是一个1~n的排列,是一个1~n排列对1~n的映射 置换群,所有的置换的集合。 经常会遇到求本质不同的构造,如旋转不同构,翻转交换不同构等。 不动点:一个置换中,置换后和置换前没有区别的排列 Burnside引理:本质不同的方案数=每个置换下不动点的个数÷置换总数(一个平均值) Polya定理:一个置换下不动点的个数=颜色^环个数。(辅助Burnside引理,防止...

weixin_34123613的博客 253
上一篇: 鸽巢定理和容斥定理 (POJ 2356 、POJ 3370 + HDU 1796)
下一篇: 最长公共子序列(LCS) 最长递增子序列(LIS) 最长递增公共子序列 (LICS)
OneLine_
博客等级 码龄9年 48粉丝 72原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值