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的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable