首页 > 代码库 > 【Polya定理】【枚举约数】【欧拉函数】【Java】poj2154 Color
【Polya定理】【枚举约数】【欧拉函数】【Java】poj2154 Color
你随便写一下出来,发现polya原理的式子里面好多gcd是相同的,gcd(n,i)=k可以改写成gcd(n/k,i/k)=1,也就是说指数为k的项的个数为phi(n/k),就很好求了,最后除的那个n直接放到指数上即可,没必要用逆元。
import java.util.*; import java.io.*; public class Main { public static int phi(int n){ int ans=n; for(int i=2;i*i<=n;++i){ if(n%i==0){ ans=ans/i*(i-1); while(n%i==0){ n/=i; } } } if(n>1){ ans=ans/n*(n-1); } return ans; } public static int Quick_Pow(int x,int p,int MOD){ if(p==0){ return 1; } int ans=Quick_Pow(x,p>>1,MOD); ans=(ans*ans)%MOD; if((p&1)==1){ ans=(x%MOD*ans)%MOD; } return ans; } public static void main(String[] argc){ int T,n,P; Scanner sc = new Scanner (new BufferedInputStream(System.in)); T=sc.nextInt(); for(int zu=1;zu<=T;++zu){ int ans=0; n=sc.nextInt(); P=sc.nextInt(); for(int i=1;i*i<=n;++i){ if(n%i==0){ ans=(ans+((phi(n/i)%P)*Quick_Pow(n,i-1,P))%P)%P; // System.out.printf("Test:%d\n",ans); if(i*i!=n){ ans=(ans+((phi(i)%P)*Quick_Pow(n,n/i-1,P))%P)%P; // System.out.printf("Test:%d\n",ans); } } } System.out.println(ans); } sc.close(); } }
【Polya定理】【枚举约数】【欧拉函数】【Java】poj2154 Color
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。