题目描述
幂 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.
(a + b) % p = (a % p + b % p) % p (1)
(a - b) % p = (a % p - b % p ) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
#include<iostream>
#include<cmath>
#include<iomanip>
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).所以我们要继续优化算法。
这个过程中,当我们的指数是偶数时,我们就把底数平方,指数/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<iostream>
#include<cmath>
#include<iomanip>
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')<<setw(3)<<quickpow(a, b) % 1000 << endl;
return 0;
}
s和a之间有7个空格,cout<<'s'<<setw(8)<<'a'<<endl;的意思是s后面输出8个字符,其中a占一个字符,剩余7个字符用空格填充
setw()默认填充的内容为空格,可以setfill()设置其他字符填充。
cout<<'s'<<setfill('*')<<setw(8)<<'a'<<endl;
则输出:
————————————————
版权声明:本文为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
#include<iostream>
#include<cmath>
#include<iomanip>
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;
}