CTX学长的快速幂

来源:互联网 发布:魔兽争霸3mac怎么安装 编辑:程序博客网 时间:2024/05/23 09:56

题目链接:点击打开链接

CTX学长的快速幂

时间限制:1 Sec内存限制:128 MiBspecial judge:No
提交:62答案正确:5

题目描述

什么?听说你会快速幂?这么厉害的吗,那我就出一道快速幂的题吧!题意很简单,给你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

这个题用一般的快速幂会错是因为极限范围会炸掉long long

那么我们只要换一种乘的方式就好。

以123*321为例:((10*10+2*10+3)*321)%1e10=(((321*10)%1e10)*10)%1e10+(((321*10)%1e10)*2)%1e10+321*3。

这道题次要对1e10取余,那么最多也是10位数乘以10也不过11位肯定不会超过long long,那么我把乘法拆成这样来算肯定不会超过范围。另外想一下快速幂的原理,我们也可以写出来一个快速乘法。只要把里边的乘号换成加号即可。这里不多做解释。用快速成也可以过。

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const long long mod=1e10;long long sucheng(long long a,long long b){    long long sum=0;    while(b)    {        sum=(sum+a*(b%10))%mod;        a=(a*10)%mod;        b/=10;    }    return sum;}//long long sucheng(long long a,long long c)//{//    long long b=0;//    while(c)//    {//        if(c&1)//            b=(b+a)%mod;//        c/=2;//        a=(a+a)%mod;//    }//    return b;//}long long poww(long long a,long long c){    long long b=1;    while(c)    {        if(c&1)            b=sucheng(a,b)%mod;        c/=2;        a=sucheng(a,a)%mod;    }    return b%mod;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        long long n,m;        scanf("%lld%lld",&n,&m);        printf("%010lld\n",poww(n,m));    }}





原创粉丝点击