次方求模 NYOJ


次方求模

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

求a的b次方对c取余的值

 

输入
第一行输入一个整数n表示测试数据的组数(n<100)
每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000)
输出
输出a的b次方对c取余之后的结果
样例输入
3
2 3 5
3 100 10
11 12345 12345
样例输出
3
1
10481
来源
[张云聪]原创
上传者
张云聪

  •                  
  •                  
  •                 


  • 思路:如果n=a*b,term=n%m,则term=a%m*b%m。那么我们可以把a的b次方看成是一
    个很大很大的数term,term=a^(b/2)*a^(b/2),T=term%c;T=a^(b/2)%c*a^(b/2)%c,这样我们就把b分解的一次,看到此时,我们就应该想到这是用二分的思想加同余模,我们就可以这样,用递归去做(减少了很多时间),但在中间需要注意如果b为奇数时,需要另乘以a,切记不要漏乘。


    #include<stdio.h>
    #include<string.h>
    long long int a,b,c;
    int pow(long long a,long long b)
    {
        if(b==1)
            return a%c;
        long long term=pow(a,b/2);
           term=term*term%c;
        if(b%2)
            term=a*term%c;
        return term;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld %lld %lld",&a,&b,&c);
            printf("%d\n",pow(a,b));
        }
        return 0;
    }
    


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值