时间限制:1 Sec内存限制:128 MiB
题目描述
什么?听说你会快速幂?这么厉害的吗,那我就出一道快速幂的题吧! 题意很简单,给你n,m的值,我想知道n的m次方是多少,但是这个答案太大了,所以你只需要输出答案最后面的十位数字即可。
输入
T组输入,接下来的T行(T<300),每一行输入n,m(0<n<=100 ,0<=m<=1000000000)
输出
输出T行,每一行输出n^m的后十位数字(不够10位用零补)。
样例输入
复制
3 2 10 3 3 1 1000000000
样例输出
0000001024 0000000027 0000000001
取余后十位为超LL
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
#define mod 10000000000
using 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;
}