快速幂和取余

poj 1995
需要的知识,
快速幂和取模的运算
1 (a+b)%p=(a%p+b%p)%p

  1. (a – b) % p = (a % p – b % p) % p

  2. (a * b) % p = (a % p * b % p) % p

  3. (a^b) % p = ((a % p)^b) % p

5… ((a+b) % p + c) % p = (a + (b+c) % p) % p

  1. ((ab) % p * c)% p = (a * (bc) % p) % p

  2. ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p

  3. 若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p)

9 若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p)

10 若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a – c) ≡ (b – d) (%p),

                                                       (a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p)                       (a≡b (% p)表示a,b对p取模 得数相同)

题目大意;
对(ab+a1b1+a2^b2……)%m 进行运算;

ac代码
#include<stdio.h>
typedef long long ll;
ll mm;
ll pow(ll a,ll b){
ll ans=1;
while(b>0){
if(b&1)ans = (ansa) % mm;
a = (a%mm)
(a%mm) % mm;
b>>=1;
}
return ans;
}
int main(){
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++){
ll n;
scanf("%lld%lld",&mm,&n);
ll a[45001][2];
for(int i=1;i<=n;i++){
scanf("%lld%lld",&a[i][0],&a[i][1]);
}
ll ans1=0;
for(int i=1;i<=n;i++){
ans1+=pow(a[i][0],a[i][1]);
}
ans1%=mm;
printf("%lld\n",ans1);
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值