信息学奥赛复赛复习16-CSP-J2022-01乘方-循环特判、pow函数、快速幂

news/2024/10/12 17:28:11
PDF文档公众号回复关键字:20241012

此前解析题,P8813 [CSP-J 2022] 乘方,给出了循环的解题思路,当时在洛谷提交是通过的,后台收到留言,a=1,b=1e9会炸吧?,确实啊整除要求1s内循环次数最大可以到10^7,现在测试数据明显大很多,按测试数据有这个可能,没想到CSP普及组第1题竟然翻车,去CCF官网去找测试数据,竟然没有2022年的测试数据,去另外一个OJ上面测试了一下,竟然有超时测试用例

提交原码

#include<bits/stdc++.h>
using namespace std;
const int N=1e9;//允许的最大值 超出输出-1 
int a,b;//输入a b 
long long m=1;//存储 a^b 
int main(){cin>>a>>b;//输入a bfor(int i=0;i<b;i++){//循环b次 m=m*a;//m从1开始每次乘以a if(m>N){//如果大于允许的最大值 输出-1 cout<<"-1";			return 0;//退出程序 }}cout<<m;//输出 a^b return 0;
}

分析

确实a=1的时候,b可以比较大,最后也需要循环结束才计算出结果,如果a不是1,循环次数就大大减少

可以分情况讨论 a=1和a!=1

下面给出3种方法

1 循环特判

#include<bits/stdc++.h>
using namespace std;
const int N=1e9;//允许的最大值 超出输出-1 
int a,b;//输入a b 
long long m=1;//存储 a^b 
int main(){cin>>a>>b;//输入a bif(a==1){cout<<"1";return 0;} for(int i=0;i<b;i++){//循环b次 m=m*a;//m从1开始每次乘以a if(m>N){//如果大于允许的最大值 输出-1 cout<<"-1";			return 0;//退出程序 }}cout<<m;//输出 a^b return 0;
}

2 用快速幂解法

如下用快速幂改造后的程序,不在超时,可以顺利通过

#include <bits/stdc++.h>
using namespace std;
const int N=1e9;
long long a,b,ans=1;
long long quickpow(long long a, long long b) {while (b) {if (b & 1) {ans = ans * a;}if(a>N) return -1;if (ans > N) return -1;a *= a;b >>= 1;}return ans;
}int main() {cin >> a >> b;cout << quickpow(a, b) << endl;	return 0;
}
/*
输入 
1 992465817
输出
1 
*/ 

普及组第1题用快速幂有点过分了,看看还有没有其他解法

3 pow函数解法

#include<bits/stdc++.h>
using namespace std;
const int N=1e9;//允许的最大值 超出输出-1 
int a,b;//输入a b
double ans; 
int main(){cin>>a>>b;//输入a bans=pow(a,b);if(ans>N){cout<<-1<<endl;}else{cout<<(int)ans;//输出 a^b	}return 0;
}
/*
输入 
1 992465817
输出 
1
*/ 

可以顺利通过

这里顺便说一些pow函数

C++中有自带的pow()函数,具有求指定底数的指定幂值。通常使用该函数求解幂

实现原理为快速幂,时间复杂度为O(logN)

#include<iostream>
#include<cmath>
using namespace std;
/*pow函数该函数接收两个参数,base 为要取次方的数,exponent 为指数。返回结果为 base 的 exponent 次方 double x =pow(base,exponent);pow=(2,3)=8 
*/ 
int main(){int base=2;int exponent=3;double x=pow(base,exponent);cout<<x<<endl;exponent=4;x=pow(base,exponent);cout<<x<<endl;return 0;
}
/*
输出
8
16 
*/ 

如下为原题

[题目描述]

小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a 和 b,求 a^b 的值是多少。

a^b 即 b 个 a 相乘的值,例如 2^3 即为 3 个 2 相乘,结果为 2×2×2=8

“简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误

小文很快意识到,她的程序里的变量都是 int 类型的。在大多数机器上,int 类型能表示的最大数为 2^31−1,因此只要计算结果超过这个数,她的程序就会出现错误

由于小文刚刚学会编程,她担心使用 int 计算会出现问题。因此她希望你在 ab 的值超过 10^9 时,输出一个 -1 进行警示,否则就输出正确的 a^b 的值

然而小文还是不知道怎么实现这份程序,因此她想请你帮忙

[输入格式]

输入共一行,两个正整数 a,b

[输出格式]

输出共一行,如果 a^b 的值不超过 10^9,则输出 a^b 的值,否则输出 -1

[输入输出样例]

输入 #1

10 9

输出 #1

1000000000

输入 #2

23333 66666

输出 #2

-1

说明/提示

数据规模

对于 10% 的数据,保证 b=1。
对于 30%的数据,保证 b≤2。
对于 60% 的数据,保证 b≤30,a^b≤ 10^18。
对于 100% 的数据,保证 1≤a,b≤10^9。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/70741.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[PEP] 还是学OI学的

咋整半夜搞个比赛呢J组还有5min。。。

24.10.12

近来不可做题最多的一场所谓 NOIp 模拟赛。怎么会有 NOIp 模拟赛放 AT 银牌题呢哈哈。 A 暴力:枚举点对 \((c, s)\),合法点对的贡献是 \((A - c + 1)\times (B - s + 1)\)。 对于 \(x = 1\) 的部分分,打表发现合法点对只有 \(c = s\) 的点对,那么贡献为 \[\begin{aligned} …

软工第二次个人作业

软工第二次个人作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253这个作业的目标 使用Python编写一个“羊了个羊”风格的消除类小游戏学号 102202106Github仓库 目录一.使用AI…

【报警视图的应用】

1. HMI报警的状态 HMI报警一般有三种状态,到达(I)、离开(O)、已确认(A),组态报警的类别不同,该报警所具有的状态也不同。 项目中默认的报警类别包含以下几种:默认的类别中,Errors类别是带单次确认的报警,具有“到达/离开/确认”三种状态,而Warnings类别是不带确认…

免费解锁数学难题——体验Math.now AI数学求解器

想要快速解决数学问题,获得分步解答?Math.now是一款免费且强大的AI数学求解器,基于先进的Math GPT技术,无论是代数、几何,还是微积分,它都能提供精准的解答,帮助您轻松掌握每个数学概念。摘要:想要快速解决数学问题,获得分步解答吗?Math.now是一款免费且强大的AI数学…

idea如何通过不同jdk版本进行打包

本地安装的jdk版本是11,有个项目想打包成jdk1.8的版本,试了好多方法还是不得行,本来是以为修改Project Structure 里面修改SDK的jdk版本就可以,试了不行 最后面发现,这个的打包方式是采用maven的setting.xml里面制定的JDK版本有关 最后修改了,maven制定的setting.xml里面…

【设备漏洞】挖掘思路

1.信息收集1.1 弱口令搜索1.2 硬编码问题2.相同组件及OEM框架挖掘2.1 组件漏洞问题2.2 OEM漏洞问题免责声明 本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。文章来源:先知社区 在日…

3DCAT实时云渲染赋能2024广东旅博会智慧文旅元宇宙体验馆上线!

2024广东旅博会再次引入3DCAT实时云渲染技术,成功构建了智慧文旅元宇宙体验馆.中国移动通信集团广东有限公司提供技术总支持,携手瑞云科技的3DCAT实时云渲染技术与广东惠众信息科技的三维建模能力,共同打造了一个全方位的沉浸式虚拟展览环境.广东国际旅游产业博览会(以下简称“…