HOJ1842 快速幂取模

Raising Modulo Numbers

#include <iostream>
using namespace std;
//计算a^bmodn
int modexp(int a,int b,int n)
{
    int ret=1;
    int tmp=a;
    while(b)
    {
       //基数存在
       if(b&0x1) ret=ret*tmp%n;
       tmp=tmp*tmp%n;
       b>>=1;
    }
    return ret;
}
int main()
{
    int Z,M,H,a,b,ans;
    cin >> Z;
    while(Z--)
    {
       ans=0;
       cin >> M >> H;
       while(H--)
       {
           cin >> a >> b;
           ans+=modexp(a%M,b,M);//我表示不懂这儿,是看别人写的,我觉得是(a1^b1+.....)%M=(a1^b1)%M+...为什么是((a%M)^b)%M+....?求解释!
           //(a+b)%c=(a%c+b%c)%c
       }
       cout << ans%M << endl;
    }
    return 0;
}
 
思路

《算法导论》也有!

发帖问啦,明白啦!!

(a+b)%c=(a%c+b%c)%c那么是不是(a1+a2+...)%c=(a1%c+a2%c+...)%c?
求证明过程!!!

不是一般性,设
a1 = m1*c + n1 => a1%c = n1
a2 = m2*c + n2 => a2%c = n2
...
an = mn*c + nn => an%c = nn
其中n1,n2...,nn都属于半开半闭区间[0,c)

那么
(a1+a2+...an)%c  
= [(m1+m2+...mn)*c + (n1+n2+...nn)]%c
= (n1+n2+...nn)%c
= (a1%c + a2%c + ... +an%c)%c


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值