Posts Tagged 置换群

置换群及Pólya定理专题

pku2369:概念题,理解置换群的合成运算即可

3878349 clumsydragon 2369 Accepted 212K 16MS C++ 579B

pku1026:置换群的幂运算

3879155 clumsydragon 1026 Accepted 208K 63MS C++ 825B

pku1721:像置换群的开方运算,但其实不用开方运算

4321228 clumsydragon 1721 Accepted 216K 16MS C++ 883B

pku3270:求最小花费(简单) 算法黑数上有讲,比较详细

4378625 clumsydragon 3270 Accepted 528K 47MS G++ 1266B

pku2409:关于环的polya,公式见下

首先是环长度为奇数的形式,一共有两种共 2 * s 个置换,分别是旋转和反射各 s 个置换,旋转的置换群除了最原始的{1,2,3,…,s} 循环个数为 s,其他循环个数模拟置换过程求得。反射的置换群有 s个,每个置换群都有 s/2 + 1个循环,包含了 s / 2 对以及处于对称轴上的那个点。

然后是环长度为偶数的实行,一共有三种,除了旋转和反射,还有“对折”(姑且这样称呼吧-_-|),旋转没有区别,反射有 s / 2 种置换,循环个数为 s/2 + 1个,”对折”也有 s/2 中置换,循环个数为 s/2 个。

推出了每种情况的循环节个数,这题就好做了,只要代入ploya公式就可以了。

4379482 clumsydragon 2409 Accepted 400K 0MS G++ 1128B

pku1286:2409简化版,注意数据范围就好了

4379536 clumsydragon 1286 Accepted 400K 0MS G++ 1139B

pku1879:这道题,minute truck, five minute truck, hour truck 都可用栈模拟,模拟一天后小球的序列:s1, s2, s3………接下来的做法基本和2369一样,需要注意的是,代表第12个小时的小球是跟在它前面的11个小球后面进入queue的,因为没有注意这点,花 费了很多时间调试

3887339 clumsydragon 1879 Accepted 208K 16MS C++ 1283B

hdoj1537:置换(算置换比较麻烦)

hdoj 1812:Ploya定理

这题刚开始用枚举所有8种置换群,找出循环个数再使用Ploya公式的方法要TLE。不过还好每种置换群的循环个数都是有规律的,可以推出 N 分别为偶数和奇数时的公式。比较麻烦的是还要用到大数,我直接用java还是跑了将近两秒……这题时间卡得有些苛刻。

897436 2008-11-15 15:25:47 Accepted 1812 1812MS 2880K 852 B Java

, , ,

No Comments

继续置换群

奉Teddy大牛暨队长之命,我这个离散白痴重新开始置换群专题。

先链接一下以前的关于这个专题的日志:置换群及Pólya定理

pku1721 CARDS : 这道题我用模拟置换群的平方运算,找出循环次数n,再顺推 n – s(mod n) 次这样的笨办法过的。最好的方法是用置换群的分数幂运算(这个还在学习中,看得相当头大),在效率上会有很大的差别,不过POJ数据偏弱了。
贴下代码:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int dor[1010];
  5. int d[2][1010];
  6.  
  7. int main()
  8. {
  9.     int n, s, i, j;
  10.     int f, nf, np, count;
  11.  
  12.     while(scanf("%d %d", &n, &s) != EOF)
  13.     {
  14.         for(i = 1; i <= n; i++)
  15.         {
  16.             scanf("%d", &dor[i]);
  17.             d[0][i] = dor[i];
  18.         }
  19.         f = 0;
  20.         np = 0;
  21.         count = 0;
  22.         while(1)
  23.         {
  24.             nf = 1 - f;
  25.             np = 1;
  26.             for(i = 1; i <= n; i++)
  27.                 if(d[f][i] != dor[i])
  28.                 {
  29.                     np = 0;
  30.                     break;
  31.                 }
  32.             if(np == 1 && count) break;
  33.             for(i = 1; i <= n; i++)
  34.                 d[nf][i] = d[f][d[f][i]];
  35.             f = nf;
  36.             count++;
  37.         }
  38.  
  39.         s = count - s % count;
  40.         f = 0;
  41.         for(i = 1; i <= n; i++)
  42.             d[0][i] = dor[i];
  43.  
  44.         for(i = 0 ; i < s; i++)
  45.         {
  46.             nf = 1 - f;
  47.             for(j = 1; j <= n; j++)
  48.                 d[nf][j] = d[f][d[f][j]];
  49.             f = nf;
  50.         }
  51.  
  52.         for(i = 1; i <= n; i++)
  53.             printf("%dn", d[nf][i]);
  54.     }
  55.     return 0;
  56. }

,

2 Comments