poj2154Color polya定理+欧拉函数优化】的更多相关文章

没想到贱贱的数据居然是错的..搞得我调了一中午+晚上一小时(哦不d飞LJH掉RP毕竟他是BUFF)结果重判就对了五次.. 回归正题,这题傻子都看得出是polya定理(如果你不是傻子就看这里),还没有翻转,就一个旋转,结果我就欢快的打完交上去了.傻子都知道会TLE,n<=1e9啊,O(n)都原地爆炸,那怎么办...一脸懵逼(然后就膜题解了) 可以发现,这题公式就是sigma(gcd(k,n))(k=1~n),然后该怎么优化呢,我(??)发现gcd(k,n)里面肯定有一些k和n的gcd是相同的,那我…
由于这是第一天去实现polya题,所以由易到难,先来个铺垫题(假设读者是看过课件的,不然可能会对有些“显然”的地方会看不懂): 一:POJ1286 Necklace of Beads :有三种颜色,问可以翻转,可以旋转的染色方案数,n<24. 1,n比较小,恶意的揣测出题人很有可能出超级多组数据,所以先打表. 2,考虑旋转: ;i<n;i++) sum+=pow(n,gcd(n,i)); 3,考虑翻转: ) sum+=n*pow(,n/+) ; else { sum+=n/*pow(,n/)…
题目描述 $T$ 组询问,用 $n$ 种颜色去染 $n$ 个点的环,旋转后相同视为同构.求不同构的环的个数模 $p$ 的结果. $T\le 3500,n\le 10^9,p\le 30000$ . 题解 Polya定理+欧拉函数 根据 poj2409 中得到的结论,答案为: $\frac{\sum\limits_{i=1}^nn^{\gcd(i,n)}}n=\sum\limits_{i=1}^nn^{\gcd(i,n)-1}$ 由于 $n$ 有 $10^9$ 之大,因此考虑优化这个式子. 枚举…
这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 旋转可以旋转 i=[1,n]次..画图可以看出循环节有gcd(n,i)个 镜像对称的置换画个图也是很容易找的 然后通过polya定理就可以容易的求出等价类的种数了 2409就是这样一个裸题,以下为ac代码 #include <iostream> #include <stdio.h> #…
http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目.旋转后一样的属于同一种.结果模p. n个珠子应该有n种旋转置换.每种置换的循环个数为gcd(i,n).假设直接枚举i,显然不行.可是我们能够缩小枚举的数目. 改为枚举每一个循环节的长度L,那么对应的循环节数是n/L.所以我们仅仅需求出每一个L有多少个i满足gcd(i,n)= n/L.就得到了循环节数为n/L的个数. 重点就是求出这种i的个数. 令cnt = gcd(i,…
题目链接:http://poj.org/problem?id=2154 题意:n 种颜色的珠子构成一个长为 n 的环,每种颜色珠子个数无限,也不一定要用上所有颜色,旋转可以得到状态只算一种,问有多少种不同的情况. 思路:polya 模板,不过数据比较大,需要用欧拉优化. 代码: #include<iostream> #include <stdlib.h> #include <algorithm> #include <stdio.h> #include<…
题目 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, a…
根据polya定理,答案应该是 \[ \frac{1}{n}\sum_{i=1}^{n}n^{gcd(i,n)} \] 但是这个显然不能直接求,因为n是1e9级别的,所以推一波式子: \[ \frac{1}{n}\sum_{i=1}^{n}n^{gcd(i,n)} \] \[ =\frac{1}{n}\sum_{d|n}n^d\sum_{i=1}^{n}[gcd(i,n)==d] \] \[ =\frac{1}{n}\sum_{d|n}n^d\sum_{i=1}^{\frac{d}{n}}[gc…
对于置换0→i,1→i+1……,其中包含0的循环的元素个数显然是n/gcd(i,n),由对称性,循环节个数即为gcd(i,n). 那么要求的即为Σngcd(i,n)/n(i=0~n-1,也即1~n).考虑枚举gcd.显然gcd(i,n)=x在该范围内解的个数是φ(n/x).分解一下质因数即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<c…
N<=1e9,O(nlogn)的做法会超时.从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) /*--------------------------------------------------------------------------------------*/ #include <algorithm> #include <iostream> #include <cstring> #include <cty…