题目地址:POJ 1286
题意:n个珠子串成一个圆,用三种颜色去涂色。问一共有多少种不同的涂色方法(不同的涂色方法被定义为:如果这种涂色情况翻转,旋转不与其他情况相同就为不同。)
思路:Polya定理第一发,这道题其实就是一个最简单的板子题。要想明白Polya定理首先要知道置换,置换群和轮换的概念,可以参考这里(用例子很好理解)。
项链可以进行旋转和翻转。
翻转:如果n是奇数,则存在...
分类:
其他好文 时间:
2015-07-24 18:36:23
阅读次数:
354
题目地址:POJ 2409
题意:给一个包含s个珠子的项链,用c种颜色对其染色,问存在多少个不同的项链。
思路:和上一篇POJ 1286差不多。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#pragma comm...
分类:
其他好文 时间:
2015-07-24 18:33:48
阅读次数:
175
1.CF Round 252 Div 2 D题目大意:给出一个N的排列,求至少通过多少次交换使得这个排列至少通过m次排列才能变成升序。题解:1.首先可以通过划分子群的方法求出初始排列需要的交换次数。然后分次数不够和超出m两种情况考虑。2.如果次数太多,说明子群太多,需要合并子群。然后草稿纸上画一下可...
分类:
其他好文 时间:
2015-07-23 09:21:29
阅读次数:
124
【解析】Burnside引理+背包dp+乘法逆元
[Analysis]
这道题卡了好久,就是没想懂置换跟着色是不一样的。
根据burnside引理,在一个置换群作用下不等价类的个数为每个置换作用下不动点个数的平均数。
在这道题中:
置换的对象 ——
每个状态,标号为1—N(这里的N不是题目的N,而是状态的个数)。
不动点 ——
前后染色状态完全相同的状态的个数。
...
分类:
其他好文 时间:
2015-07-22 22:48:48
阅读次数:
199
1.确定初始和目标状态。明确。目标状态的排序状态。2.得出置换群,。比如,数字是845327,目标状态是234578。能写为两个循环:(827)(435)。3.观察当中一个循环,明显地。要使交换代价最小,应该用循环里面最小的数字2。去与另外的两个数字。7与8交换。这样交换的代价是:sum-min+(...
分类:
其他好文 时间:
2015-06-22 09:48:52
阅读次数:
119
会了,会了,终于会了下面 项链,手镯以例子进行解释关键就是置换群,循环节区别就是手镯可以翻转,但是项链不可以题例:输入整数n和t,输出用t种颜色的n颗珠子(每种颜色的珠子的数目没有限制,但是珠子的总数必须是n)能制出的 项链和珠子的个数旋转:如果逆时针旋转i颗 珠子的间距,则珠子0,i,2i,,,,...
分类:
其他好文 时间:
2015-06-08 23:01:23
阅读次数:
176
题目:有双配对出错鞋子,要求最少的交换次数,使得鞋子配对摆放。
分析:组合数学,置换群。统计置换中循环的个数k,则结果为n-k。
循环内部(设有m个元素)需要交换m-1次(除最后一次,每次交换最多只能有一个复位)
说明:注意鞋子的编号不一定是1~n,是1~10000之间的数字,计算时需要做映射。
#include
#include
#include
#incl...
分类:
其他好文 时间:
2015-05-29 06:15:46
阅读次数:
171
斯特林数:
1. 第一类斯特林数:
a) S(n,k)意义:
将n个物体排成k个非空循环排列的方法数。也就是把n个数分成k个非空置换群的方法数。
b) 递推公式:
S(n,k) = (n-1)*S(n-1,k) + S(n-1,k-1) , 1
S(n,0) = 0 , n >= 1
S(n,n) = 1 , n >= 0
c) 性质:
|S(n,1)| = (n-1)...
分类:
其他好文 时间:
2015-04-24 12:37:32
阅读次数:
150
置换群第三题,找出循环节,然后取余进行操作,加深了对置换的应用,越发感觉置换群很有趣。
#include
#include
#include
#include
using namespace std;
const int maxn =201;
int n,k;
char s[maxn],ss[maxn];
int zh[maxn],b[maxn],zz[maxn],f[maxn],ok[maxn...
分类:
其他好文 时间:
2015-04-23 02:06:11
阅读次数:
120
置换群的第二题,一开始总是tle,后来一思考,置换根本不是这个情况,置换是一种排列,就用了几个数组将输入的数进行操作,最后A了,对置换有一些了解了。
#include
#include
#include
using namespace std;
const int maxn = 10000+10;
int n,least;
int a[maxn],b[1000010],s[maxn],tmp[1...
分类:
其他好文 时间:
2015-04-23 00:07:04
阅读次数:
158