次方求模 NYOJ

来源:互联网 发布:销售库存软件 编辑:程序博客网 时间:2024/05/17 00:58


次方求模

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

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

 

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

 


思路:如果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;}