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是相同的,那我们设n=i*gcd,k=j*gcd,那i肯定和j互质并且1<=j<=i,而且可以发现,gcd(i*gcd,j*gcd)=gcd,只要知道j有多少个,就让power(n,n/i)乘上这个个数,那gcd=n/i的所有情况就都解决了,那具体j有多少个呢?显而易见(??)就是欧拉函数值(然而我不会)了,那我们O(sqrt(n))枚举i,然后就可以得出gcd,然后就可以求出欧拉函数值,那就是phi(i)*power(n,n/i)
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
bool v[];
int pr,prime[];
void linear_prime()
{
memset(v,true,sizeof(v));
for(int i=;i<=;i++)
{
if(v[i]==true)prime[++pr]=i;
for(int j=;j<=pr&&i*prime[j]<=;j++)
{
v[i*prime[j]]=false;
if(i%prime[j]==)break;
}
}
}
int n,mod;
int power(int A,int k)
{
int ans=;A%=mod;
while(k!=)
{
if(k%==)ans=(ans*A)%mod;
A=(A*A)%mod;k/=;
}
return ans;
}
int phi(int x)//求欧拉函数值,即j的种数
{
int ans=x;
for(int i=;prime[i]*prime[i]<=x;i++)
{
if(x%prime[i]==)
{
ans=ans-ans/prime[i];
while(x%prime[i]==)x/=prime[i];
}
}
if(x!=)ans=ans-ans/x;
return ans%mod;
}
int main()
{
linear_prime();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&mod);
int ans=;
//设n=i*gcd 而 k=j*gcd,用欧拉函数将所有j的值求出
for(int i=;i*i<=n;i++)
{
if(n%i==)
{
ans=(ans+phi(i)*power(n,n/i-))%mod;//循环节为gcd
if(i*i!=n)ans=(ans+phi(n/i)*power(n,i-))%mod;
//这里两个power为什么要-1?由于要%mod,所以求值的时提早将/G(G=n)给做了
}
}
printf("%d\n",ans);
}
return ;
}
poj2154Color polya定理+欧拉函数优化的更多相关文章
- POJ2154 Color【 polya定理+欧拉函数优化】(三个例题)
由于这是第一天去实现polya题,所以由易到难,先来个铺垫题(假设读者是看过课件的,不然可能会对有些“显然”的地方会看不懂): 一:POJ1286 Necklace of Beads :有三种颜色,问 ...
- 【poj2154】Color Polya定理+欧拉函数
题目描述 $T$ 组询问,用 $n$ 种颜色去染 $n$ 个点的环,旋转后相同视为同构.求不同构的环的个数模 $p$ 的结果. $T\le 3500,n\le 10^9,p\le 30000$ . 题 ...
- poj2409 & 2154 polya计数+欧拉函数优化
这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 ...
- poj 2154 Color(polya计数 + 欧拉函数优化)
http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目.旋转后一样的属于同一种.结果模p. n个珠子应该有n种旋转置换.每种置换 ...
- poj2154(polya定理+欧拉函数)
题目链接:http://poj.org/problem?id=2154 题意:n 种颜色的珠子构成一个长为 n 的环,每种颜色珠子个数无限,也不一定要用上所有颜色,旋转可以得到状态只算一种,问有多少种 ...
- POJ2154 Color 【Polya定理 + 欧拉函数】
题目 Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). ...
- poj 2154 Color【polya定理+欧拉函数】
根据polya定理,答案应该是 \[ \frac{1}{n}\sum_{i=1}^{n}n^{gcd(i,n)} \] 但是这个显然不能直接求,因为n是1e9级别的,所以推一波式子: \[ \frac ...
- Luogu4980 【模板】Polya定理(Polya定理+欧拉函数)
对于置换0→i,1→i+1……,其中包含0的循环的元素个数显然是n/gcd(i,n),由对称性,循环节个数即为gcd(i,n). 那么要求的即为Σngcd(i,n)/n(i=0~n-1,也即1~n). ...
- poj2154-color-polyan次二面体+欧拉函数优化
N<=1e9,O(nlogn)的做法会超时.从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) /*---------------------------- ...
随机推荐
- linux shell管道和xargs的区别
如上图,加了xargs的话相当于将上一个操作的结果作为命令执行前的操作,不加的话直接先把后面的命令运行一遍再操作
- 如何在非localhost情况下访问Istio中的服务UI
在使用Istio时经常会遇到需要用localhost访问服务UI才能看到相关的一些数据 但对于远程连接的时候使用localhost并不方便,所以需要修改一下它的部署文件,将原先的cluster IP改 ...
- C++中,什么叫类,结构,联合?
在C++中 class 和 struct 本质上一样 可以互用class的成员默认是private的,struct的成员默认是public的但一般习惯把成员变量隐藏的用class申明, 成员变量可以公 ...
- mybatis查询返回null解决方案
mybatis查询返回null解决方案: 问题:查询出的列与javabean中的字段名不一致. 解决方案: 1.将javabean中的字段改为和查询出的列名一致: 2.将sql加入as改变列名,和ja ...
- [NOIP2002] 提高组 洛谷P1031 均分纸牌
题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...
- ES6__Iterator和for...of循环
/** * Iterator和for...of循环 */ // --------------------------------------------------------------- /** ...
- 蓝桥杯 算法提高 金属采集 [ 树形dp 经典 ]
传送门 算法提高 金属采集 时间限制:1.0s 内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫 ...
- lightoj 1293 - Document Analyzer [ 两指针 + 字符串 ]
传送门 1293 - Document Analyzer PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: ...
- msp430项目编程27
msp430中项目---多机通信系统 1.I2C工作原理 2.I2C通信协议 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- 用 Gearman 分发 PHP 应用程序的工作负载【转载】
通过本文,了解工作分发系统 Gearman 并分发用 PHP.C.Ruby 及其他受支持语言编写的应用程序的工作负载. 尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体 ...