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

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位用零补)。

样例输入

复制
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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值