首页 > Web开发 > 详细

HDU-1061-Rightmost Digit(快速幂取模)

时间:2021-01-25 19:07:02      阅读:32      评论:0      收藏:0      [点我收藏+]

http://acm.hdu.edu.cn/showproblem.php?pid=1061

题意:

给定一个整数T,有T组数据,每组包含一个整数N,(N<=1e9)求每组数据N的N次方最后一个数字。

思路:

快速幂取模,基于以下公式:

(a*b)%m=( (a%m)*(b%m) )%m;

代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iomanip>
#include<algorithm>
#include<string.h>
#include<queue>

using namespace std;
const int maxn=5e5+10;
const int inf=2147483647;
typedef long long ll;

ll n=1e9+10;

ll mod(ll a,ll b)
{
    if(b==1) return a;

    ll s=mod(a,b/2)%10;
    if(b%2==0) return (s*s)%10;
    else return (s*s*a)%10;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        cout<<mod(n,n)<<endl;
    }
    system("pause");
    return 0;
}

快速幂的非递归写法:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iomanip>
#include<algorithm>
#include<string.h>
#include<queue>

using namespace std;
const int maxn=5e5+10;
const int inf=2147483647;
typedef long long ll;

ll n=1e9+10;

ll mod(ll a,ll b)
{
    ll sum=1;
    while(b)
    {
        if(b&1) sum=(sum*a)%10;
        b>>=1;
        a=(a*a)%10;
    }
    return sum;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        cout<<mod(n,n)<<endl;
    }
    system("pause");
    return 0;
}

 

HDU-1061-Rightmost Digit(快速幂取模)

原文:https://www.cnblogs.com/sweetlittlebaby/p/14326450.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!