KIDx的解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2239
题意:这个项链有n个的珠子组成,珠子的类型有m种,请问能组成多少种不同类型的项链(若一个项链可以通过另一个项的链旋转得到,那么认为这两个项链为同一种项链)。答案可能很大,请对9937取模
解析:先由polya定理得到:
ans = sum(m^gcd (i, n), i∈(1, n)) / n;
由于n太大(1<n<2^31),不能直接for循环求
要用到欧拉函数:
首先要搞明白phi(n/i)表示1~n有多少个数跟n的最大公约数是i
然后就问题就转换成:枚举n的约数,例如是p那么1~n中与n最大公约数为p的就有phi(n/p)个,把这种情况累计到res中:res+= phi(n/p) * (m^p);
累计完后,因为是边累计边取余,而且后面要除以n
本来逆元就行了,但是题目是有问题的,有些数据是不存在逆元的,是不能出答案的,但是hdu的结果是求最小的数。。。
所以这里利用等式res/n % mod = ans---> res% mod = ans*n% mod,从0~9936枚举ans找到最小满足的答案即可。。。
#include <iostream>
#include <math.h>
using namespace std;
#define M 66000
#define LL __int64
int p[6600], k, vis[M] = {0}, mod = 9937;
int Euler (int n)
{
int i, res = n;
for (i = 0; i < k && (LL)p[i]*p[i] <= n; i++)
{
if (n % p[i] == 0)
{
do
n /= p[i];
while (n % p[i] == 0);
res = res - res/p[i];
}
}
if (n > 1) res = res - res/n;
return res % mod;
}
int qmod (int a, int b)
{
a %= mod;
int res = 1;
for ( ; b; b >>= 1)
{
if (b & 1) res = res * a % mod;
a = a * a % mod;
}
return res;
}
int main()
{
int n, m, i, j, ms, ans;
k = 0;
for (i = 2; i < M; i++)
{
if (!vis[i])
{
p[k++] = i;
for (j = i+i; j < M; j+=i)
vis[j] = 1;
}
}
while (~scanf ("%d%d", &n, &m))
{
ms = (int)sqrt (n+0.5);
ans = 0;
for (i = 1; i <= ms; i++)
{
if (n % i == 0)
{
ans = (ans + Euler (n/i)*qmod (m, i)%mod) % mod;
if (i != n/i) ans = (ans + Euler (i)*qmod (m, n/i)%mod) % mod;
//不要忘了还有右边的约数n/i要枚举
}
}
int tot = ans;
for (ans = 0; ans < mod; ans++)
if ((LL)ans*n % mod == tot % mod)
break;
printf ("%d\n", ans);
}
return 0;
}
分享到:
相关推荐
Polya定理 Polya定理是组合数学中用来计算全部互异的组合状态的个数的一个十分高效、简便的工具。下面,我就向大家介绍一下什么是Polya定理以及它的应用。 Polya定理的基本概念: 1. 群:群是一个满足封闭性、...
总的来说,Polya定理提供了一种系统化的方法来处理与对称性相关的计数问题,不仅在项链涂色问题上有应用,在其他领域如图论、化学、编码理论等也有着广泛的应用。理解和掌握这个定理,对于解决实际的组合计数问题是...
在给定的文件描述中,提到了Polya定理在计算一个由n个珠子组成的项链,用k种颜色进行涂染时,可以形成多少种不同的项链的问题。这一问题的解决不仅涉及到Polya定理的核心概念,还可能需要结合动态规划来优化算法效率...
c++技术 Polya定理及其应用
- **项链珠子问题**(如POJ1286):将三种不同颜色的珠子串成有\( n \)个珠子的项链,旋转/翻转后相同的算同一种,求方案数。 - 解答步骤: 1. 考虑旋转情况:\( n \)个点顺时针旋转\( i \)个位置的置换,循环数为...
Polya定理,全称为Polya计数定理,是组合数学中的一种重要工具,用于统计有限群作用下的不变量的数量。在解决实际问题时,尤其是涉及到颜色着色或者排列组合的问题时,Polya定理能帮助我们系统地计算出各种可能的...
### 怎样解题 Polya #### 知识点一:Polya 解题法概述 Polya 解题法是由匈牙利数学家 George Pólya 提出的一种解决数学问题的方法论。这种方法强调从不同的角度来理解和解决问题,尤其适用于面对复杂或看似...
关于组合数学很详细的ppt,描述了polya定理,清晰易懂
作者: George Polya / Gordon Latta ISBN: 9780471693307 定价: USD 32.95 出版社: John Wiley & Sons Inc 装帧: Hardcover 出版年: 1974-01-01
作者: George Polya / Gabor Szegö 副标题: Series, Integral Calculus, Theory of Functions (Classics in Mathematics) ISBN: 9783540636403 页数: 389 定价: USD 49.95 出版社: Springer 装帧: Paperback 出版...
Pólya原理是组合数学中,用来计算全部互异的组合状态的个数的一个十分高效、简便的工具。下面,我就向大家介绍一下什么是Pólya原理以及它的应用。请先看下面这道例题: 【例题1】 对2*2的方阵用黑白两种颜色涂色...
[方法论]Polya How to Solve It 2004 英文版
ACM组合数学波利亚计数解析,通过例题解释波利亚计数的简单入门用法。
Burnside引理和Polya定理PPT教学课件.pptx 本资源摘要信息是关于 Burnside 引理和 Polya 定理的 PPT 教学课件。该课件主要介绍了群论和置换群的基本概念和性质,以及 Burnside 引理和 Polya 定理的应用。 知识点....
polya计数法算法的讲解,以及它在acm中的应用。
聚γ 纯Java中Polya-Gamma分布的高效采样器。 它还与其他发行版兼容。例子// use default samplerPolyaGammaDistribution pg1 = new PolyaGammaDistribution ( 2 , 4 );double x = pg1 . sample(); double mean = pg...
How to solve it 清晰英文版
### Polya技术理论习题解答知识点解析 #### 组合数学与Pólya计数理论 **知识点一:置换群与共轭类** 在组合数学中,置换群是一组对象的所有可能排列方式形成的群,而共轭类则是指在群内通过其他元素的左乘或右乘...