思路:
易知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 = Np - {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 }