博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数论】【Polya定理】【枚举约数】【欧拉函数】【Java】poj2154 Color
阅读量:6868 次
发布时间:2019-06-26

本文共 1124 字,大约阅读时间需要 3 分钟。

你随便写一下出来,发现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();    }}

转载于:https://www.cnblogs.com/autsky-jadek/p/6680665.html

你可能感兴趣的文章
linux的运行级别及相应含义
查看>>
pip 仓库镜像地址
查看>>
Linux日志文件总管——logrotate
查看>>
【大数据-第二期】java基础第三天作业
查看>>
小措施提高Linux服务器安全
查看>>
数据一致性
查看>>
linux大于2T硬盘分区方法
查看>>
ISAPI_Rewrite 1.3 版本做301转向的问题
查看>>
Lucene In Action 读书笔记(一)
查看>>
iOS 9适配技巧(更新版)
查看>>
实时群聊小程序开发记录
查看>>
Python 数据库备份脚本(邮件通知)
查看>>
学习SDL的一些资料(整理)
查看>>
[动态库]深入分析Windows和Linux动态库应用异同
查看>>
Linux下查看CPU信息、机器型号等硬件信息命令
查看>>
Lync Server 2013 部署 _ 部署简介及系统要求
查看>>
前端小随笔
查看>>
view属性大全
查看>>
xshell如何保存日志
查看>>
删除遗留在系统的旧网卡设备驱动
查看>>