zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    myEclipse Debug
    C# DataTable的詳細使用方法
    算法 《秦九韶算法java实践》
    【闲聊产品】之五:谁来背黑锅?
    ubuntu install mysql server method
    H264解码的一个測试程序
    Struts2自己定义拦截器实例—登陆权限验证
    【剑指offer】二叉树的镜像
    ubuntu12.04下搭建ftpserver
    C++Vector使用方法
  • 原文地址:https://www.cnblogs.com/wangyiming/p/6756254.html
Copyright © 2011-2022 走看看