U253835 乘方星球(A^B Problem) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
觉得我的文章对你有帮助的话,请加入洛谷团队向着胜利奔赴 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
一起共勉,一起成长!
题目背景
小明参加了2022年的CSP竞赛, 在琢磨计数排序,基数排序和桶排序的区别, 以及研究O(n inf+1)这个无限还带常数的复杂度之时, 转瞬间,一望无际的天空被撕裂出了一道巨大的口子,顿时电闪雷鸣, 他被一道来自外太空的暗紫色宇宙射线击中, 因此和车牌上的O和I一起, 来到了一个奇妙的星球,名叫乘方星球。 星球上的人们把他抓到了监狱里, 要求他说出一个大整数(A)的大整数(B)次方, 就把他放回地球。
小明对此束手无策,哭着要找妈妈, 但马上他擦干眼泪,又想到了机智的你, 于是他立刻派大O和θ, 带着他刚刚和同桌完成的期末大作业来找你,请求支援。 你检查完他的作业后,就是不明白mod -k是什么意思,于是你询问大O和θ, 他们告诉你,现在不要管这个了, 让你快点解决这个万分火急的大整数的乘方问题。 你一拍脑门,开始研究如何解题, 如果你研究出来了,就把答案贴在洛谷平台, 本题满分200分,获得160分就可以解救小明哦!
Tips:
别人拿%80,Pythoner只能>获得%79的数据分,即99分我就知道你是Pythoner
题目描述
输入两个整数(存在负数) A, B,输出A的B次方(无需对某数取模早就知道你会用FMXDL什么的)
Tips:本题的第79/80/99/100个测试点为附加题,各10分,重在参与!
#include<bits/stdc++.h>
using namespace std;
int main()
{
int A, B;
cin >> A >> B;
cout << pow(A, B);
return 0;
}
这种死算的代码,是不可能过的 (cpp可得3分好像)
value = input().split()
print(int(value[0])**int(value[1]))
Pythoner们的代码应该被坚决杜绝!!
输入格式
输入共有一行:A B,用空格分隔.
输出格式
输出共有一行,输出答案.
输入输出样例
输入 #1
123456789 10
输出 #1
822526259147102579504761143661535547764137892295514168093701699676416207799736601
输入 #2
-3 3
输出 #2
-27
输入 #3
9999999999999999 16
输出 #3
9999999999999984000000000000011999999999999994400000000000001819999999999999563200000000000080079999999999988560000000000001286999999999999885600000000000008007999999999999563200000000000018199999999999999440000000000000011999999999999999840000000000000001
说明/提示
数据范围
- 对于10%的数据:0<A<100, B≤4;
- 对于20%的数据:0<A<10^8, B≤10;
- 对于30%的数据:-10^8<A<10^8, B≤10;
- 对于60%的数据:-10^24<A<10^24, B≤30;
- 对于98%的数据:-10^128<A<10^128, 0<B≤1024;
- 对于100%的数据:-10^1024<A<10^1024, 0<B≤1024.
简单题解
千万不要用Python(98分)!!!
很明显,这是一道高精度的题,
应该写一个struct加一个函数(可以写运算符重载)比较好
// =例如:
const int maxn = 0x7f;
struct Value{int val[maxn];}A, B;
void print_val(Value x);
//或int类型返回值
Value mul(Value x, Value y);
Value calc(Value x, int y){
//快速幂;
}
//或重载operator+;
int main()
{
cin >> A >> B;
声明Value型a并初始化;
print_val(calc(a, B));
return 0;
}
高精相乘不展开了,网上教程满天飞,print_val函数记得要去除首零,ValueStruct可以再加一个integer属性length
附:
快速幂:二分
摘自知乎Pecco评论
递归快速幂
刚刚我们用到的,无非是一个二分的思路。我们很自然地可以得到一个递归方程:
an={an−1⋅a,if n is oddan2⋅an2,if n is even but not 01,if n=0
计算a的n次方,如果n是偶数(不为0),那么就先计算a的n/2次方,然后平方;如果n是奇数,那么就先计算a的n-1次方,再乘上a;递归出口是a的0次方为1。
//递归快速幂
int qpow(int a, int n)
{
if (n == 0)
return 1;
else if (n % 2 == 1)
return qpow(a, n - 1) * a;
else
{
int temp = qpow(a, n / 2);
return temp * temp;
}
}
能拿到30分的要努力哦
能拿到100分的人已经不错了(我的水平)
能拿到160分的就是高手了
能拿到180分的是天才
能拿到200分的。。。
time to 点赞
看完后,别忘了
点赞!
收藏!
Thanks……
小明在参加CSP竞赛时意外来到乘方星球,被要求计算大整数A的B次方来换取自由。本题需避免使用Python直接计算,推荐采用高精度计算及快速幂算法。
&spm=1001.2101.3001.5002&articleId=127345649&d=1&t=3&u=4b7a86d0d9264b368b943b15d8bd64b3)
4488

被折叠的 条评论
为什么被折叠?



