快速幂取模 nyoj

来源:互联网 发布:计算机图形学编程 编辑:程序博客网 时间:2024/05/21 10:00

求m的n次方对去q取余数的结果。

 有T组数据;

0<m,n,q<10000000

//分析:

//1.如果按正常的先求次幂,然后再取余数,即便用long long 也不可能存的下,

//2.然而如果用数组,或字符串存储,也是非常耗时的,必定超时.

 ///3.由于无论先取余数,还是后取余数,都不会影响结果。(ep:假如a%b=c,那么a=x*b+c,其中x=a/b)

//4.所以就应该用到   快幂求模    了.

 

 

#include<stdio.h>
int main()
{
 int T;
 int m,n,q,num;
 scanf("%d",&T);
 while(T--) 
 {
  num=1;////用num储存   奇数个的元素
  scanf("%d%d%d",&m,&n,&q);
  m=m%q;//先进行预处理,使得运算数据尽可能小 
  while(n!=1)a//当元素个数变为1个时,结束循环 
  {
   if(n%2==1)    
   {    
    num=num*m;//将多余的单个元素存放到   num中。    
    num=num%q;//防止num过大,超范围    
    n--;    
   }   
   m=m*m;//每两个元素合为一个元素,使得元素数量减半、   
   m=m%q;//防止a过大
   n=n/2;//元素个数减半,加快运行素度   
  }  
  m=m*num;//把多余的数和最后剩下的一个元素合起来  
  printf("%d\n",m%q);
 } 
 return 0;
}

//哪不清楚就评论一下,会尽量解答的

 

0 0