poj 2154 Color 欧拉函数优化的ploya计数
枚举位移肯定超时,对于一个位移i。我们须要的是它的循环个数,也就是gcd(i,n),gcd(i,n)个数肯定不会非常多,由于等价于n的约数的个数。
所以我们枚举n的约数。对于一个约数k,也就是循环个数为n/k这种个数有phi[k]种,证明网上有非常多。
所以答案就是 phi[k]*(pow(n,n/k)) (k是n的全部约数)
因为约数会非常大所以不能打表,仅仅能单个算。
再因为最后要除以n,假设做除法就不能直接取模,所以我们在算每一次pow(n,n/k)的时候,都少乘一个n,这样就相当于除法了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1000000;
int quickpow(int m,int n,int k)
{
int ans=1;
while(n)
{
if(n&1) ans=(ans*m)%k;
n=(n>>1);
m=(m*m)%k;
}
return ans;
}
bool a[N];
int prim[N];
int pp[N];
void Prime()
{
memset(a, 0, sizeof(a));
int num = 0, i, j;
pp[1]=1;
for(i = 2; i < N; ++i)
{ if(!(a[i])) prim[num++]=pp[i]=i;
for(j = 0; (j<num && i*prim[j]<N); ++j)
{
pp[i*prim[j]]=prim[j];
a[i*prim[j]] = 1;
if(!(i%prim[j])) break;
}
}
}
int phi(int x)
{
int i,j;
int num = x;
for(i = 0; prim[i]*prim[i] <= x; i++)
{
if(x % prim[i] == 0)
{
num = (num/prim[i])*(prim[i]-1);
while(x % prim[i] == 0)
{
x = x / prim[i];
}
}
}
if(x != 1) num = (num/x)*(x-1);
return num;
}
int main()
{
Prime();
int cas,n,p;
scanf("%d",&cas);
while(cas--)
{
int ans=0;
scanf("%d%d",&n,&p);
for(int l=1;l*l<=n;l++)
{
if(n%l==0)
{
if(l*l==n)
{
ans+=phi(l)%p*quickpow(n%p,l-1,p);
ans%=p;
break;
}
ans+=phi(l)%p*quickpow(n%p,n/l-1,p);
ans+=phi(n/l)%p*quickpow(n%p,l-1,p);
ans%=p;
}
}
printf("%d\n",ans);
}
return 0;
}
poj 2154 Color 欧拉函数优化的ploya计数的更多相关文章
- poj2409 & 2154 polya计数+欧拉函数优化
这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 ...
- poj 2154 Color(polya计数 + 欧拉函数优化)
http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目.旋转后一样的属于同一种.结果模p. n个珠子应该有n种旋转置换.每种置换 ...
- POJ2154 Color【 polya定理+欧拉函数优化】(三个例题)
由于这是第一天去实现polya题,所以由易到难,先来个铺垫题(假设读者是看过课件的,不然可能会对有些“显然”的地方会看不懂): 一:POJ1286 Necklace of Beads :有三种颜色,问 ...
- POJ 2480 (约数+欧拉函数)
题目链接: http://poj.org/problem?id=2480 题目大意:求Σgcd(i,n). 解题思路: 如果i与n互质,gcd(i,n)=1,且总和=欧拉函数phi(n). 如果i与n ...
- Poj 2478-Farey Sequence 欧拉函数,素数,线性筛
Farey Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14291 Accepted: 5647 D ...
- poj2154Color polya定理+欧拉函数优化
没想到贱贱的数据居然是错的..搞得我调了一中午+晚上一小时(哦不d飞LJH掉RP毕竟他是BUFF)结果重判就对了五次.. 回归正题,这题傻子都看得出是polya定理(如果你不是傻子就看这里),还没有翻 ...
- poj2154-color-polyan次二面体+欧拉函数优化
N<=1e9,O(nlogn)的做法会超时.从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) /*---------------------------- ...
- POJ 2407 Relatives(欧拉函数)
题目链接 题意 : 求小于等于n中与n互质的数的个数. 思路 : 看数学的时候有一部分是将欧拉函数的,虽然我没怎么看懂,但是模板我记得了,所以直接套了一下模板. 这里是欧拉函数的简介. #includ ...
- poj 2773 利用欧拉函数求互质数
题意:找到与n互质的第 k个数 开始一看n是1e6 敲了个暴力结果tle了,后来发现k达到了 1e8 所以需要用到欧拉函数. 我们设小于n的 ,与n互质的数为 (a1,a2,a3.......a(p ...
随机推荐
- JavaScript 逗号操作符
让我们从一个有趣的微博开始吧. 末尾的c是优先级最低的逗号操作符.逗号操作符是操作符优先级的最后一行,并且很少有文章记录,它隐藏着它的锋芒.它可能不是JavaScript强势操作符,但是我喜欢它.它简 ...
- i++和++i的区别,及其线程安全问题
i++和++i都是i=i+1的意思,但是过程有些许区别: i++:先赋值再自加.(例如:i=1:a=1+i++:结果为a=1+1=2,语句执行完后i再进行自加为2) ++i:先自加再赋值.(例如:i= ...
- Python内置函数(4)
Python内置函数(4) 1.copyright 交互式提示对象打印许可文本,一个列表贡献者和版权声明 2.credits 交互式提示对象打印许可文本,一个贡献者和版权声明的列表 3.delattr ...
- OmniGraffler软件和激活码
mac上用户画图的软件:OmniGraffler破解方法 1.激活码 Name: Appked SN: MFWG-GHEB-HYTW-CGHT-CSXU-QCNC-SXU 2.软件连接 链接: htt ...
- 【转】OPC远程访问相关配置信息
原文:http://blog.gkong.com/kking_25653.ashx 对于远程访问OPC服务器,需要在客户和服务器计算机上都进行DCOM设置,本文提供一些具体配置方法.(by Kevin ...
- ffmpeg的函数av_samples_get_buffer_size分析,对齐的意思
/* * 此函数只应用于音频. * 计算出:要把一系列的样本保存起来,需要多大的缓存. * sample,单个通道的单次采样所得到的样本数据. * planar,和yuv存储格式一样,声音也分平面(p ...
- BZOJ 3227 [Sdoi2008]红黑树(tree) ——贪心 动态规划
首先可以想到一个贪心的方法,然后一层一层的合并. 也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据. 交上去居然A掉了. 贪心 #include < ...
- Codeforces 894.A QAQ
A. QAQ time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- c++ primer note
---恢复内容开始--- 1.decltype 2.auto 3.cbegin 4.cend 5.constexpr 6.(*Parray)[10]=&arr; //Parray 指向一个含有 ...
- 前端ui框架---ant 蚂蚁金服开源
蚂蚁金服和饿了么好像不错 饿了么官网:http://element.eleme.io/#/zh-CN饿了么github:http://github.com/elemefe 蚂蚁金服 https:// ...