快速幂取模 nyoj

本文介绍了一种高效计算大数幂对模结果的方法——快速幂求模算法,适用于求解形如m^n % q的问题,其中m, n, q的范围在0 < m, n, q < 10000000。通过预处理减少数据规模,并利用循环迭代进行计算,避免了直接计算可能引发的溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求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;
}

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值