洛谷原题

按照题意,我们需要把每个数的每一位乘起来,再和 \(k\) 比较大小。

输入

看一下数据范围,\(a_i \le 10^{100000}\),考虑使用字符串 string 存储所有 \(a_i\)

计算

接下来,我们来进行计算。考虑一种极端情况,就是有很多个数字 \(9\)。直接乘连 __int128 都会爆。因此需要优化计算方式。

如何优化计算方式?

Step 1

判断字符串里有没有数字 \(0\)。因为无论多大的数乘以 \(0\),结果还是 \(0\)。而 \(1 \le k\),可以直接输出 kawaii

Step 2

循环遍历每一位,把每一位乘起来。值得注意的是,如果当前结果大于 \(k\),可以提前跳出循环。因为结果只会越来越大,再算下去没有意义。输出 dame

Step 3

全部数位乘起来之后,和 \(k\) 比较。如果比 \(k\) 大,输出 dame,否则输出 kawaii

AC 记录

AC 代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int q,k;
    scanf("%d %d",&q,&k);
    while(q--){
        string s;
        cin>>s;
        if(s.find("0")!=string::npos){
            printf("kawaii\n");//乘积一定为 0,没必要计算。
            continue;
        }
        bool f=0;
        long long p=1;//为防万一,开 long long 保险一点。
        for(int i=0; i<s.size(); i++){
            int g=s[i]-'0';
            p*=g;
            if(p>k){//乘积大于 k,提前结束。
                f=1;//f = 1 表示这个数不是可爱的。
                break;
            }
        }
        if(f==1){
            printf("dame\n");
        }else{
            printf("kawaii\n");//表示这个数是可爱的。
        }
    }
    return 0;
}
posted on 2026-06-29 21:25  lz5332t  阅读(3)  评论(0)    收藏  举报