poj 2154 Color(polya计数 + 欧拉函数优化)

2024-08-28 10:32

本文主要是介绍poj 2154 Color(polya计数 + 欧拉函数优化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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,n) = n/L;

那么cnt | i,令i = cnt*t(0 <= t <= L);

又 n = cnt * L ;

所以gcd(i,n) = gcd( cnt*t, cnt*L) = cnt,

满足上式的条件是 gcd(t,L) = 1。

而这样的t 有Eular(L)个。

因此循环节个数是n/L的置换个数有Eular(L)个。

参考博客:http://blog.csdn.net/tsaid/article/details/7366708


代码中求欧拉函数是基于素数筛的,素数只需筛到sqrt(1e9)即可。我在筛素数的同时递推的记录了sqrt(1e9)以内的Eular(n),用phi[]表示。这样会快那么一点点。


#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#define LL long long
#define _LL __int64
#define eps 1e-8
#define PI acos(-1.0)
using namespace std;const int maxn = 35000;
const int INF = 0x3f3f3f3f;int n,p;
int ans;
int prime[maxn];
int flag[maxn];
int prime_num;
int phi[maxn];int mod_exp(int a, int b, int c)
{int res = 1;a = a%c;while(b){if(b&1)res = (res*a)%c;a = (a*a)%c;b >>= 1;}return res;
}//素数筛并记录maxn以内的Eular(n),用phi[]表示
void get_prime()
{memset(flag,0,sizeof(flag));prime_num = 0;phi[1] = 1;for(int i = 2; i <= maxn; i++){if(!flag[i]){prime[++prime_num] = i;phi[i] = i-1;}for(int j = 1; j <= prime_num && i*prime[j] <= maxn; j++){flag[i*prime[j]] = 1;if(i % prime[j] == 0)phi[i*prime[j]] = phi[i] * prime[j];else phi[i*prime[j]] = phi[i] * (prime[j]-1);}}
}int Eular(int n)
{if(n < maxn)return phi[n] % p;//求大于maxn的Eular(n)int res = n;for(int i = 1; prime[i]*prime[i] <= n && i <= prime_num; i++){if(n % prime[i] == 0){res -= res/prime[i];while(n%prime[i] == 0)n = n/prime[i];}}if(n > 1)res -= res/n;return res%p;
}int main()
{int test;get_prime();scanf("%d",&test);while(test--){scanf("%d %d",&n,&p);ans = 0;for(int l = 1; l*l <= n; l++){if(l*l == n){ans = (ans + Eular(l)*mod_exp(n,l-1,p))%p;}else if(n%l == 0) //循环节长度为l,那么n/l也是循环节长度{ans = (ans + Eular(l)*mod_exp(n,n/l-1,p))%p;ans = (ans + Eular(n/l)*mod_exp(n,l-1,p))%p;}}printf("%d\n",ans);}return 0;
}


这篇关于poj 2154 Color(polya计数 + 欧拉函数优化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114509

相关文章

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Python Excel 通用筛选函数的实现

《PythonExcel通用筛选函数的实现》本文主要介绍了PythonExcel通用筛选函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录案例目的示例数据假定数据来源是字典优化:通用CSV数据处理函数使用说明使用示例注意事项案例目的第一

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱