CF 334 div.2-D Moodular Arithmetic

思路:

易知k = 0的时候答案是pp-1,k = 1的时候答案是pp

当k >= 2的时候,f(0) = 0,对于 1 <= n <= p - 1,如果f(n)确定,由题意可知f(kin mod p)也随之确定,那么这种迭代什么时候停止呢?这就需要找出循环节,即能使km mod p = 1的最小的m,这个m就是k的阶数o(k)。这里(G = N- {0}, 模p乘法)实际上是一个循环群,设G中的元素k的阶数o(k) = m, 则k作为生成元生成的子群也是循环群,并且子群的阶为m且m能整除群的阶p-1。(参见离散数学(邓米克,邵学才等编著)清华大学出版社,p252)),所以剩下的p-1(1 ~ p-1)个数实际上构成了(p - 1) / m 个同构的子循环群。这种情况下,答案就是

p(p - 1)/m

实现:

 1 import java.util.*;
 2 
 3 public class Main {
 4 
 5     private static final int mod = 1000000007;
 6     public static long pow(long x, long n, long mod) {
 7         long res = 1;
 8         while (n > 0) {
 9             if((n & 1) == 1)
10                 res = res * x % mod;
11             x = x * x % mod;
12             n >>= 1; 
13         }
14         return res;
15     }
16     
17     public static void main(String[] args) {
18         Scanner in = new Scanner(System.in);
19         long p = in.nextInt(), k = in.nextInt();
20         if (k == 0)
21             System.out.println(pow(p, p - 1, mod));
22         else if (k == 1)
23             System.out.println(pow(p, p, mod));
24         else {
25             long ord = 1;
26             long tmp = k;
27             while (tmp != 1) {
28                 tmp = tmp * k % p % mod;
29                 ord++;
30             }
31             System.out.println(pow(p, (p - 1) / ord, mod));
32         }    
33     }
34 }
原文地址:https://www.cnblogs.com/wangyiming/p/6756254.html