快速幂——数论算法

快速幂应用场景:

题型:HDOJ-1061-Rightmost Digit
Atcoder Regular Contest 113 B-A ^ B^C


代码模板:

快速幂模板

int qmi(int a,int k,int q)
{
	int res=1;
	while(k)
	{
		if(k & 1) res=(LL)res*a%p;
		k>>=1;
		a=(LL)a*a%p;
	} 
	return res; 
}

HDOJ快速幂分析:

HDOJ-1061-Rightmost Digit

求N ^ N个位数上的结果,所以可以直接求(N % 10) ^ N,再将结果对10取余。
快速幂可以参照文章开头给出的模板
AC代码如下:

#include <iostream>

using namespace std;

typedef long long LL;
const int mod=10;
int qmi(LL a,LL k)
{
	LL res=1;
	while(k)
	{
		if(k & 1) res=res*a%mod;
		
		a=a*a%mod;
		k>>=1;
	} 
	return res; 
}


int main()
{
	int t;
	LL n;
	cin>>t;
	while(t--)
	{
		cin>>n;
		int ans;
	
		ans=qmi(n%10,n)%10;
	
		cout<<ans<<endl;
	}
	
	return 0;
}

规律+快速幂分析:

对于数的幂,1~9的幂级数都有周期,所以根据数字本身的规律也可以直接得到最低位上的数是多少。
0,1,5,6无论经过多少次平方的得数个位数永远是其本身,故输出其本身即可。
2的k次幂个位是2,2k次幂个位是4,,3k次幂是8,4k次幂是6
3的k次幂个位是3,2k次幂个位是9,,3k次幂是7,4k次幂是1
7的k次幂个位是7,2k次幂个位是9,,3k次幂是3,4k次幂是1
8的k次幂个位是8,2k次幂个位是4,,3k次幂是2,4k次幂是6
4的偶次幂个位是6,奇次幂个位是4
9的偶次幂个位是1,奇次幂个位是9
…………

Atcoder Regular Contest 113 B-ABC
提示:本道题需特判一下B^C=0时的情况,因为任何数的0次幂都等于1。只要还原一下取模之前的数,即mod本身就可以了。

AC代码如下:

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include<vector>
#include<algorithm>
#include <queue>
using namespace std;
#define LL long long


LL qmi(LL a,LL k,int p)
{
	LL res=1;

	while(k)
	{
		if(k & 1) res=res*a%p;
		k>>=1;
		a=a*a%p;
	}
	return res;
}

int main()
{
	cin.tie();
	LL a,b,c;
	int mod;
	cin>>a>>b>>c;
	a=a%10;
	if(a==1 || a==5 || a==6 ||a==0 ) cout<<a;
	else
	{
		if(a==4 || a==9)  mod=2;
		if(a==2 || a==3 || a==7 || a==8) mod=4;
		
		LL ans1=qmi(b,c,mod);
		if(ans1==0) ans1=mod;
		
		LL ans2=qmi(a,ans1,10)%10;
		
		cout<<ans2;
	}

	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值