按照题意,我们需要把每个数的每一位乘起来,再和 \(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 代码
#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;
}
浙公网安备 33010602011771号