CSP-J 2022复赛题解

前言

马上复赛了, 行李有点慌张, 做做去年的真题吧, 最讨厌 DP DP BFS BFS

第一题 pow

题面链接

得分情况

100AC 100 AC

思路

ab a^b 的值,第一想到的是pow函数,可是数据范围是 1e9 1e9 , 1e9 1e9 绝对会超pow函数的范围。那就只能自己写乘方了!!

正常我们求幂都是循环b b 次,每次ans=a ans*=a ,可是看到数据范围1e9 1e9 ,可是程序限制是1s 1s 也就是1e8 1e8

既然判断如果结果大于1e9 1e9 就输出1 -1 ,就可以在每一次循环里判断ans ans 是否大于1e9 1e9 ,如果是就输出1 -1 ,退出程序。再来分析一下,除去1 1 1 1 要特判,如果a a 1 1 ,就直接输出1 1

那么进入循环的条件是 大于等于2 大于等于 2 ,取它等于2 2 230 2^{30} 大于1e9 1e9 ,当循环到 230 2{30} 的时候就会退出,a a 越大,循环次数越小,对时间没有影响! 最后记得写freopen!

启示

第一题一般不会用太难的方法,可以大胆模拟。模拟完,再计算其时间复杂度、空间复杂度,如果觉得很大可能会超,可以进一步优化,比如,换输入方式,快读快写等

代码

#include<bits/stdc++.h>

using namespace std;

const int N = 1e9;
long long ans=1;
int main(){
    // freopen("pow.in", "r", stdin);
    // freopen("pow.out", "w", stdout);
    int a, b;
    scanf("%d%d", &a, &b);
    if(a == 1) {
        printf("1\n");
        return 0;
    }
    
    for(int i = 1; i <= b; i++){
        ans *= a * 1LL;
        if(ans > N){
            printf("-1\n");
            return 0;
        }
    }
    printf("%lld", ans);
    return 0;
}

最后

没有最后