关于数论【polya计数法】
可以预见数论推公式是有多么蛋疼。
让我简明扼要的讲讲吧(多都说不出来,毕竟才做了两道题)其实呢,这个算法应该归入群论,有个有用的东西:置换群,它表示一个集合包括很多的置换。
先讲讲置换吧:↓(这是个置换)
1 2 3 4
3 1 2 4
怎么个置换法呢?这个就代表,第1个状态置换后变成第3个状态,第2个状态置换后变成第1个状态,第3个状态置换后变成第2个状态,第4个状态置换后变成第4个状态。
然后就是循环节:
1 2 3 4 5
3 5 1 4 2
它等于:(13)(25)(4)
那循环节长度就等于3
嘿嘿,简单吧。
然后就是一个神奇的定理——polya定理,设这个群{g1,g2,……gG}G为置换群的置换数,c(g)表示这个置换的循环节长度,用m种颜色涂点,那不同的涂色方案为:m^c(g1)+m^c(g2)+m^c(gG)的和除以G(这个我实在是证不出来,死记吧),然而c(g)怎么理解?其实这个来源于Burnside引理,我们将其优化变成polya定理,那这个是什么?
burnside引理:用D(i)表示在置换中不变的个数,怎么理解?例如第一个置换,4就是不变的,那这个置换的D就等于1。那不同的涂色方案就等于ΣGi=1 *D(i)。这个循环节的想法,就是来自于这里的D,同时,由于polya有很大局限性(因为直接用polya题目就太简单啦T>*<T)所以说有很多题都是要用引理+优化。
例题:poj2409
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b)
{
if(a==)return b;
return gcd(b%a,a);
}
LL power(LL A,LL k)
{
LL ans=;
while(k!=)
{
if(k%==)ans*=A;
A*=A;k/=;
}
return ans;
}
int main()
{
LL n,m;
while(scanf("%lld%lld",&m,&n)!=EOF)
{
if(n==&&m==)break;
LL ans=; for(int i=;i<=n;i++)ans+=power(m,gcd(i,n));
//旋转置换,枚举旋转的豆子个数,置换数为n,循环节长度为LCM(i,n)/i,循环节数为n/(LCM(i,n)/i)=gcd(i,n)
//翻转置换
if(n%==)//假如是奇数,就只有一种情况,n个豆子有n种置换,循环节为(n+1)/2
{
ans+=n*power(m,(n+)/);
}
else//假如是偶数,两种情况,对称轴过豆子或过间隔
{
ans+=n/*power(m,n/);//对称轴过间隔,所有豆子翻转,有n/2种置换,循环节为n/2
ans+=n/*power(m,(n+)/);//对称轴过豆子,两个豆子不变,其他翻转,有n/2种置换,循环节为(n+2)/2
}
printf("%lld\n",ans/(n*));//G=n*2
}
return ;
}
关于数论【polya计数法】的更多相关文章
- 《程序设计中的组合数学》——polya计数
我们在高中的组合数学中常常会碰到有关涂色的问题,例如:用红蓝两种颜色给正方形的四个顶点涂色,会有几种不同的方案.在当时,我们下意识的认为,正方形的四个顶点是各不相同的,即正方形是固定的.而实际上我们知 ...
- Jam的计数法
Jam的计数法 题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数 ...
- hdu 5868:Different Circle Permutation 【Polya计数】
似乎是比较基础的一道用到polya定理的题,为了这道题扣了半天组合数学和数论. 等价的题意:可以当成是给正n边形的顶点染色,旋转同构,两种颜色,假设是红蓝,相邻顶点不能同时为蓝. 大概思路:在不考虑旋 ...
- csv 中 数值被自动转换成科学计数法 的问题 excel打开后数字用科学计数法显示且低位变0的解决方法
保存在csv中的 013812345678,前面的0会被去掉,后面是科学计数法显示.保存成 col1,="013812345678" 即可. 注意,分隔符逗号后面直接接“=”等号. ...
- 【转】js 中导出excel 较长数字串会变为科学计数法
[转]js 中导出excel 较长数字串会变成科学计数法 在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串 ...
- C# 科学计数法转换成数字
/// <summary> /// 判断输入的数是否是科学计数法.如果是的话,就会将其换算成整数并且返回,否则就返回false. /// </summary> /// < ...
- C# 中科学计数法转成正常值
抓取数据的时候碰到科学技术法,查了一些资料,直接贴代码 /// <summary> /// 数字科学计数法处理 /// </summary> /// <param nam ...
- PAT 1024. 科学计数法 (20)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位 ...
- PHP 如何显示大数字,防止显示为 科学计数法 形式
PHP 数字超过一定长度时,会自动转换为 科学计数法 的形式,如 1.2345678912346E+16: 如何 避免转换,让它原样展示呢? 不过,可以用PHP函数 number_format() 来 ...
随机推荐
- DEV Express中ImageCollection的使用
1, ImageCollection作为窗体组件的一种,位于Components分类下,拖进窗体以后,显示在界面的底部. 2, 注意ImageCollection的Imag ...
- 在不是modelAttribute的情况下,如何保存页面输入值的方法(多行遍历)
<c:forEach var="prdRelInfo" items="${goodRelPrdList}" varStatus="s" ...
- python基础——2(基本数据类型及运算符)
目录 为何数据要区分类型? 一.数字类型 1.整型int 2.浮点型float 二.字符串str 三.列表类型list 四.字典类型 五.布尔类型 运算符的介绍 一.算术运算符 二.比较运算符 三.赋 ...
- Linux使用yum命令安装软件时,连接不了网路报错:ERROR 6 - "Couldn't resolve host 'mirrorlist.centos.org'"
错误: 解决方案: 在/etc/sysconfig/network-scripts/ifcfg-eth0文件中配置DNS信息: vim /etc/sysconfig/network-scripts/i ...
- BeautifulSoup实例
Beautiful Soup 4.4.0 中文文档:http://beautifulsoup.readthedocs.io/zh_CN/latest/ #coding:utf-8from bs4 im ...
- java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
今天这个问题排查了好大一会,开始网上有人这么说: https://www.cnblogs.com/rookiebob/p/3749396.html 但是仍未能解决我的问题, 最后发现是只在外层的pom ...
- python re 正则提取中文
需求: 提取文本中的中文和数字字母(大小写都要),即相当于删除所有标点符号. 其中new是原字符串 news = re.findall(r'[\u4e00-\u9fa5a-zA-Z0-9]',new)
- 图的最小生成树——Prim算法
Prim算法 Prim算法求最小生成树是采取蓝白点的思想,白点代表已经加入最小生成树的点,蓝点表示未加入最小生成树的点. 进行n次循环,每次循环把一个蓝点变为白点,该蓝点应该是与白点相连的最小边权的是 ...
- datatable生成easyui的json格式汇总( 转)
转自 http://www.cnblogs.com/WikStone/archive/2012/07/02/2573137.html 目前项目没有使用第三方的json转换库,都是根据json格式进行字 ...
- python学习笔记--面向对象的编程和类
一.面向对象的编程 面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想.二.面向对象的特性类:class类,对比现实世界来说就是一个种类,一个模 ...