Color POJ
来源:互联网 发布:linux 查看硬盘使用率 编辑:程序博客网 时间:2024/05/17 00:13
Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of the necklace can be produced. You should know that the necklace might not use up all the N colors, and the repetitions that are produced by rotation around the center of the circular necklace are all neglected.
You only need to output the answer module a given number P.
Input
The first line of the input is an integer X (X <= 3500) representing the number of test cases. The following X lines each contains two numbers N and P (1 <= N <= 1000000000, 1 <= P <= 30000), representing a test case.
Output
For each test case, output one line containing the answer.
Sample Input
5
1 30000
2 30000
3 30000
4 30000
5 30000
Sample Output
1
3
11
70
629
这道题就是各种数学定理的应用
首先是可以确定是使用Polya定理
因为只考虑旋转的重复的问题,所以可以确定,对于一个数量为n的串,那么其置换群的大小为n(不包括对换的情况)
那么对于每个群所得的循环节的大小,我们可以通过gcd(i,n)来计算,但是可以发现,n的范围太大,逐个枚举铁定会超时,这里用得到技巧是不去枚举i,而去枚举每个循环节的长度设为L。
设d=gcd(i,n)
那么n=L*d,
对于i,我们设a使得i=a*d,
那么可知a和L必然互质,假设我们先确定了L,那么我们就只需要去找有多少个不同的d与L互质,这就是应用到了欧拉函数,那么在L下,一共有euler(L)个d,也就是有多少个i。
到此我们就可以去枚举L了,然后计算与之相应的euler(L)值。
但是即使如此,线性枚举L还是有超时的可能
当n%L==0满足时,其实际上n/L也是满足能被n整除,而我们就可与利用这个额外的信息去优化也就是折半枚举
这道题的到这里的处理和HDU-2588如出一辙
代码:
import java.util.Scanner;public class Main { static int mod; public static void main(String[]args) { Scanner sc=new Scanner(System.in); int t=sc.nextInt(); while((t--)>0) { int n=sc.nextInt(); mod=sc.nextInt(); long ans=0; int i=0; for(i=1;i*i<n;i++) { if(n%i==0)//然后能整除,那我们就得到了i和n/i两个可除的数 ans=(ans+quick(n,n/i-1)*euler(i)+quick(n,i-1)*euler(n/i))%mod; } if(i*i==n)//如果恰n可开放,那么在这种情况下只要除一次 ans=(ans+quick(n,i-1)*euler(i))%mod; System.out.println(ans); } } static long quick(int a,int b)//这里为了处理Polya部分的幂运算,使用了快速mi加速 { long ans=1; a%=mod; while(b>0) { if((b&1)==1) { ans=(ans*a)%mod; } a=a*a%mod; b>>=1; } return ans; } static int euler(int n)//欧拉函数 { int res=n; for(int i=2;i*i<=n;i++) { if(n%i==0) { res-=res/i; while(n%i==0) n/=i; } } if(n>1) res-=res/n; return res%mod; }}
- Color POJ
- Color POJ
- Color POJ
- POJ 2777 Count Color
- poj 2777 Count Color
- poj 2777 count color
- POJ-2154 Color
- poj 2777 Count color
- poj 2777 Count Color
- Poj 2777 Count Color
- POJ 2777 Count Color
- poj 2777 count color
- POJ Color有感
- POJ 2777 Count Color
- poj 2777 Count Color
- poj 2777 count color
- poj 2777 Count Color
- poj 2777 Count Color
- 计算机中的存储单位,bit ,Byte, KB, MB, GB,TB...
- Effective Java读书笔记十四(Java Tips.Day.14)
- android基于zxing实现扫描中对扫描线条的更改
- SpringMVC-框架介绍
- 初探java虚拟机
- Color POJ
- 关于开机出现“安装程序正在为首次使用计算机做准备”的解决方案及微软OOBE与SYSPREP的实用技巧
- UART遇到两个与 stty 相关问题
- 单链表自动生成函数
- Geode多节点集群实验
- ios 使用自带的UIViewController实现qq加号下拉菜单的功能
- (leetcode) Keyboard Row
- Python安装Anaconda出现Error opening file for writing错误
- 程序员技术怀旧_晒晒那些过去的经典