C++ 洛谷题之U253835 乘方星球(A^B Problem)

小明在参加CSP竞赛时意外来到乘方星球,被要求计算大整数A的B次方来换取自由。本题需避免使用Python直接计算,推荐采用高精度计算及快速幂算法。

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……

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘉定世外的JinJiayang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值