poj 2154 Color(欧拉函数模板+ploya定理)
2013-09-09 15:36
176 查看
题目要求:给出两个整数n和p,代表n个珠子,n种颜色,要求不同的项链数,并对结果mod(p)处理。
置换只有旋转一种方式,那么共有n个置换
基本知识:环的个数为gcd(n , i) , 长度L=n / gcd(n , i) 其中 i 为转的位子数
普通求法: ∑n^( gcd(n,i) ) 0<=i<n 复杂度过高
优化:枚举环的长度L
枚举优化: L可以从1取到sqrt(n) ,因为L|n , n/L | n
对于每个L,我们再看有几个i满足条件
n/L = gcd(n , i)
那么令 a=n/L = gcd(n , i) , 再设i = at
那么当且仅当gcd(L,t)=1时候,才有gcd(n,i) = a
显然满足条件的i的个数就是t的个数也就是phi(L)
那么最后统计一下就是 ∑(phi(L) * N^(L-1) ) % p (L即枚举值)
置换只有旋转一种方式,那么共有n个置换
基本知识:环的个数为gcd(n , i) , 长度L=n / gcd(n , i) 其中 i 为转的位子数
普通求法: ∑n^( gcd(n,i) ) 0<=i<n 复杂度过高
优化:枚举环的长度L
枚举优化: L可以从1取到sqrt(n) ,因为L|n , n/L | n
对于每个L,我们再看有几个i满足条件
n/L = gcd(n , i)
那么令 a=n/L = gcd(n , i) , 再设i = at
那么当且仅当gcd(L,t)=1时候,才有gcd(n,i) = a
显然满足条件的i的个数就是t的个数也就是phi(L)
那么最后统计一下就是 ∑(phi(L) * N^(L-1) ) % p (L即枚举值)
#include<iostream> #include<cstdio> #include<string.h> #include<math.h> #include<vector> using namespace std; typedef int LL; LL n,p,res; #define N 80005 int prime ,vis ; void inint() { int i,j,k,c=0; memset(vis,0,sizeof(vis)); for(i=2;i<N;i++) { if(!vis[i]) { prime[c++]=i; } for(j=0;j<c&&(k=prime[j]*i)<N;j++) { vis[k]=1; if(i%prime[j]==0) break; } } } LL pow(LL a,LL m) { LL r=1; a=a%p; //没用的话,中间会超int while(m) { if(m&1) r=(r*a)%p; a=(a*a)%p; m>>=1; } return r; } LL euler(LL x) //单独求欧拉函数模板 { LL r=x; for(int i=0;prime[i]*prime[i]<=x;i++) { if(x%prime[i]==0) r=r/prime[i]*(prime[i]-1); while(x%prime[i]==0) x/=prime[i]; } if(x>1) r=r/x*(x-1); return r; } int main() { int j,t; LL i; inint(); scanf("%d",&t); while(t--) { res=0; scanf("%d%d",&n,&p); for(i=1;i*i<n;i++) { if(n%i==0) res=(res+(euler(n/i)%p)*pow(n,i-1)+(euler(i)%p)*pow(n,n/i-1))%p; } if(i*i==n) res=(res+(euler(i)%p)*pow(n,i-1))%p; printf("%d\n",res); } return 0; }
相关文章推荐
- poj 1006 中国剩余定理模板
- poj 2407 Relatives(欧拉函数模板题)
- poj 2154 Color【polya定理+欧拉函数】
- poj 2409(polya定理模板)
- poj 2154 Color 欧拉函数优化的ploya计数
- poj 1006 中国剩余定理模板
- poj-2478 求前n个欧拉函数值的总数(模板)。
- POJ - 2891 中国剩余定理模板题
- poj 2154 Color Polya定理 欧拉函数优化
- POJ 2154 Color Polya(Polya定理+欧拉函数)
- poj 1006 中国剩余定理模板
- 欧拉函数模板 附hdu1286&poj 2407&hdu1787 &hdu2824 【pascal】
- poj 1006中国剩余定理(模板题)
- POJ - 2154 Color - (Ploya定理,欧拉函数,1~n的gcd(n,i)之和)
- poj 1006 中国剩余定理模板
- poj 2409(polya定理模板)
- 数论 - 欧拉函数模板题 --- poj 2407 : Relatives
- POJ-2407-Relatives(欧拉函数模板题)
- Color POJ - 2154 (Polya定理)(欧拉函数优化)
- 数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)