CTX学长的快速幂(快速幂运用)

来源:互联网 发布:js获取td的父节点tr 编辑:程序博客网 时间:2024/05/23 13:52
Progress Bar

时间限制:1 Sec内存限制:128 MiB

题目描述

什么?听说你会快速幂?这么厉害的吗,那我就出一道快速幂的题吧!题意很简单,给你n,m的值,我想知道n的m次方是多少,但是这个答案太大了,所以你只需要输出答案最后面的十位数字即可。

输入

T组输入,接下来的T行(T<300),每一行输入n,m(0<n<=100  ,0<=m<=1000000000)

输出

输出T行,每一行输出n^m的后十位数字(不够10位用零补)。

样例输入

复制
32 103 31 1000000000

样例输出

000000102400000000270000000001
取余后十位为超LL#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define LL long long#define mod 10000000000using namespace std;//举个栗子:(a)6541341165*(b)9846541356//将b拆开拆成,9,8,4,6,5,4,1,2,5,6//然后把a*b变成:a*6+a*10%mod*5+a*10%mod*10%mod*2+a*10%mod*10%mod*10%mod*1+.....以此类推//这样就能解决a*b会爆LL的问题了。LL chengfa(LL a,LL b){    LL sum=0;    while(b)    {        sum=(sum+a*(b%10))%mod;        a=a*10%mod;        b=b/10;    }    return sum;}//LL chengfa(LL a,LL b)//如果mod为1e18的话就必须这样写了,用二进制解决这个问题//{//    LL sum=0;//    while(b)//    {//        if(b%2==1) sum=(sum+a)%mod;//        a=(a+a)%mod;//        b=b/2;//    }//    return sum;//}//看懂后你会发现这个代码和快速幂的代码基本上一样。*和+的区别。LL pow(LL a,LL b){    LL sum=1;    while(b)    {        if(b%2==1) sum=chengfa(sum,a);        a=chengfa(a,a);//这里的a是一个小于mod的数字,a可能是一个十位数的数字//两个十位数相乘是二十位的数字,那么就超过了LL//所以要想办法使得a*a不超过LL,具体看chengfa()函数。        b=b/2;    }    return sum;}int main(){    int n;    scanf("%d",&n);    while(n--)    {        int a,b;        scanf("%d%d",&a,&b);        printf("%010lld\n",pow((LL)a,(LL)b));    }    return 0;}