2019河北省赛B题(x^n%p)

题目链接:https://ac.nowcoder.com/acm/contest/903/B
同类型题目:https://www.51nod.com/Challenge/Problem.html#!#problemId=1013
(x^n)%p

运算规则:
模运算与基本四则运算有些相似,但是除法例外。其规则如下:
(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 (4)
结合律:
((a+b) % p + c) % p = (a + (b+c) % p) % p (5)
((ab) % p * c)% p = (a * (bc) % p) % p (6)
分配律:
(a+b) % p = ( a % p + b % p ) % p (7)

#include <stdio.h>
typedef long long ll;
ll c;
//快速求幂
ll power(ll a, ll b ,ll _MOD)
{
    ll ans = 1;
    while (b)
    {
        if (b & 1)
        {
            ans = (ans * a) % _MOD;
            b--;
        }
        b >>= 1;  //  b/2
        a = (a * a) % _MOD;
    }
    return ans;
}

//**注意递归循环**
***ll sum(ll a, ll k,ll _MOD)
{
    if (k == 1)
    {
        return a;
    }
    c = sum(a, k/2,_MOD);    //前k/2个次幂的和
      //ans等于前k/2个次幂的和加上奇数次方
    ll ans = (c + c * power(a,k/2,_MOD)) % _MOD;
                      //奇数次方
    if (k & 1)    //k是否为奇数
    {
        ans = (ans + power(a, k,_MOD)) % _MOD;   //偶数次
    }
    return ans;
}***
int main()
{
    ll n,q,_MOD;
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld%lld", &q,&n,&_MOD);
       printf("%lld\n",((sum(q,n,_MOD) % _MOD)));
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值