以上为我的拙见,哈,请见谅哒
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;
}