nyoj 次方求模 102 (快速幂)

来源:互联网 发布:paxos算法和zookeeper 编辑:程序博客网 时间:2024/05/17 23:49

次方求模

时间限制: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
//必须用long long 形式(在这块WA了3次),但int型是可以存储到1000000000.
//快速幂的具体思想就是,将x的y次方,变为(x*x)的(y/2)次方,然后依次类推。
#include<stdio.h>#include<string.h>#include<math.h>long long int a,b,c;long long ks(long long int x,long long int y,long long int c){long long int val=1;while(y){x%=c;if(y&1)val*=x;val%=c;y>>=1;x*=x;x%=c;}return val;}int main(){int t;int sum;scanf("%d",&t);while(t--){scanf("%lld%lld%lld",&a,&b,&c);printf("%lld\n",ks(a,b,c));}return 0;}
//改进后的快速幂,更直观。
#include<stdio.h>#include<string.h>#include<math.h>long long int a,b,c;long long ks(long long int x,long long int y,long long int c){long long int val=1;while(y){if(y&1)//判断y是否为奇数,若是先乘上一个 x,将其变为偶数再取余。 val=(val*x)%c;y>>=1;//这块是关键::y 的值除以2,代表个数缩小一半。 x=(x*x)%c;//x变为两个x的乘积再取余。(缩短时间的关键) }return val;}int main(){int t;scanf("%d",&t);while(t--){scanf("%lld%lld%lld",&a,&b,&c);printf("%lld\n",ks(a,b,c));}return 0;}


0 0