2023/11/25 幂的末尾(快速幂,对齐输出)

 题目描述

幂 a^b的末 3 位数是多少?

 输入格式

两个正整数 a,b。1<=a<=100;1<=b<=10000

从高位到低位输出幂的末三位数字,中间无分隔符。若幂本身不足三位,在前面补零。

输入:2 3 输出:008;输入:7 2011输出:743

首先观察a,b的范围:1<=a<=100;1<=b<=10000。无法把a^b给计算出来。那么就有如下的思路。

由于取模运算的性质:

(a*b)%p=[(a%p)*(b%p)]%p.

  1. (a + b) % p = (a % p + b % p) % p (1)

  2. (a - b) % p = (a % p - b % p ) % p (2)

  3. (a * b) % p = (a % p * b % p) % p (3)

2023/11/25 幂的末尾(快速幂,对齐输出)_第1张图片

2023/11/25 幂的末尾(快速幂,对齐输出)_第2张图片

#include
#include
#include
using namespace std;

int main()
{
	int a, b;
	cin >> a >> b;
	int x=1;
	for (int i = 0; i < b; i++)
	{
		x *= a;
		x %= 1000;
	}
	if (x > 99)
	{
		cout << x << endl;
	}
	else if (x <= 99 && x > 9)
	{
		cout << "0" << x << endl;
	}
	else if(x<10)
	{
		cout << "00" << x << endl;
	}
		return 0;
}

然而这样的复杂程度仍然是O(b).所以我们要继续优化算法。

2023/11/25 幂的末尾(快速幂,对齐输出)_第3张图片

这个过程中,当我们的指数是偶数时,我们就把底数平方,指数/2.当指数是奇数时,我们就分一个原底数出来,再接着继续指数为偶数时的操作。这样大大减少了复杂度=O(log2b).将所有变量均定义为long long。

long long quickpow(long long a, long long b,long long p)
{
	if (b == 0)
	{
		return 1;
	}
	else if (b % 2==0)
	{
		return quickpow(a * a % p , b / 2);
	}
	else
	{
		return quickpow(a * a % p, b / 2) * a % p ;
	}
}

完整代码如下

#include
#include
#include
using namespace std;
long long quickpow(long long a, long long b)
{
	if (b == 0)
	{
		return 1;
	}
	else if (b % 2==0)
	{
		return quickpow(a * a % 1000, b / 2);
	}
	else
	{
		return quickpow(a * a % 1000, b / 2) * a % 1000;
	}
}
int main()
{
	long long a, b;
	cin >> a >> b;
	cout << setfill('0')<

 s和a之间有7个空格,cout<<'s'<

setw()默认填充的内容为空格,可以setfill()设置其他字符填充。

cout<<'s'<

则输出:


————————————————
版权声明:本文为CSDN博主「沈辞镜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2301_80023141/article/details/134571577

快速幂

题目描述

给你三个整数 a,b,p,求 a^b mod p。

输入格式

输入只有一行三个整数,分别代表 a,b,p。

输出格式

输出一行一个字符串 `a^b mod p=s`,其中 a,b,p 分别为题目给定的值, s 为运算结果。

样例输入 
2 10 9
样例输出 
2^10 mod 9=7

2023/11/25 幂的末尾(快速幂,对齐输出)_第4张图片

 

#include
#include
#include
using namespace std;
long long quickpow(long long a, long long b,long long p)
{
	if (b == 0)
	{
		return 1;
	}
	else if (b % 2==0)
	{
		return quickpow(a * a % p, b / 2, p);
	}
	else
	{
		return quickpow(a * a % p, b / 2, p) * a % p;
	}
}
int main()
{
	long long a, b, p;
	cin >> a >> b >> p;
	cout << a << "^" << b << " mod " << p << "=" << quickpow(a, b, p) % p << endl;

	return 0;
}

 

你可能感兴趣的:(c++,洛谷,c++,算法)