快速幂取模模板算法

以上为我的拙见,哈,请见谅哒


 long long quick_multi(long long a,long long b,long long m)///a*b%m
 {
     long long ans=0;
     while(b)
     {
         if(b&1)
         {
             ans=(ans+a)%m;
             b--;
         }
         b>>=1;
         a=(a<<1)%m;
     }
     return ans;
 }



long long quick_pow(long long a,long long b,long long m)
 {
     long long ans=1;
     while(b)
     {
         if(b&1)
         {
             ans=(ans*a)%m;
             b--;
         }
         b>>=1;
         a=a*a%m;
     }
     return ans;
 }

例题二:Raising Modulo Numbers(pku 1995)

有一种游戏规则是这样的:每个游戏者选择两个数Ai,Bi.并写在纸上,每个人都不能看到其他人写的数字,在同一时间每个人将自己的两个数展示给其他人,看谁能够在最快的时间内算出Ai^Bi的和对M取模的值。

输入:第一行是一个证书t,说明有t组测试数据,对于每组测试数据的第一行为M(1<=M<=45 000)(要对其取模的数),第二行为一个整数H(0<=H<=45 000),表示参加游戏的人数,接下来的H行,每行有两个整数,每行包括两个整数Ai,Bi。

输出:对于每组测试数据,输出相应的计算结果

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
long long quick_mod(long long a,long long b,long long m)
{
    long long ans=1;
    while(b)
    {
        if(b&1)
        {
            ans=ans*a%m;
            b--;
        }
        b>>=1;
        a=a*a%m;
    }
    return ans;
}
int main()
{
    int t;
    cin>>t;
    long long n,m,ans,a,b;
    while(t--)
    {
        cin>>m>>n;
        ans=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a>>b;
            ans=(ans+quick_mod(a,b,m))%m;
        }
        cout<<ans<<endl;
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值