gesp(C++五级)(5)洛谷:B3929:[GESP202312 五级] 小杨的幸运数
题目描述
小杨认为,所有大于等于 a a a 的完全平方数都是他的超级幸运数。
小杨还认为,所有超级幸运数的倍数都是他的幸运数。自然地,小杨的所有超级幸运数也都是幸运数。
对于一个非幸运数,小杨规定,可以将它一直 + 1 +1 +1,直到它变成一个幸运数。我们把这个过程叫做幸运化。例如,如果 a = 4 a=4 a=4,那么 4 4 4 是最小的幸运数,而 1 1 1 不是,但我们可以连续对 1 1 1 做 3 3 3 次 + 1 +1 +1 操作,使其变为 4 4 4,所以我们可以说, 1 1 1幸运化后的结果是 4 4 4。
现在,小杨给出 N N N 个数,请你首先判断它们是不是幸运数;接着,对于非幸运数,请你将它们幸运化。
输入格式
第一行 2 2 2 个正整数 a , N a, N a,N。
接下来 N N N 行,每行一个正整数 x x x ,表示需要判断(幸运化)的数。
输出格式
输出
N
N
N 行,对于每个给定的
x
x
x ,如果它是幸运数,请输出 lucky
,否则请输出将其幸运化后的结果。
样例 #1
样例输入 #1
2 4
1
4
5
9
样例输出 #1
4
lucky
8
lucky
样例 #2
样例输入 #2
16 11
1
2
4
8
16
32
64
128
256
512
1024
样例输出 #2
16
16
16
16
lucky
lucky
lucky
lucky
lucky
lucky
lucky
提示
样例解释 1
虽然是完全平方数,但它小于
a
a
a,因此它并不是超级幸运数,也不是幸运数。将其进行
3
3
3 次
+
1
+1
+1 操作后,最终得到幸运数
4
4
4。4是幸运数,因此直接输出 lucky
。
5 5 5 不是幸运数,将其进行 3 3 3 次 + 1 +1 +1 操作后,最终得到幸运数 8 8 8。
9
9
9 是幸运数,因此直接输出 lucky
。
数据规模
对于 30 % 30\% 30% 的测试点,保证 a , x ≤ 100 , N ≤ 100 a,x \le 100,N \le 100 a,x≤100,N≤100。
对于 60 % 60\% 60% 的测试点,保证 a , x ≤ 1 0 6 a,x \le 10^6 a,x≤106。
对于所有测试点,保证 a ≤ 1 , 000 , 000 a \le 1,000,000 a≤1,000,000;保证 N ≤ 2 × 1 0 5 N \le 2 \times 10^5 N≤2×105;保证 1 ≤ x ≤ 1 , 000 , 001 1 \le x \le 1,000,001 1≤x≤1,000,001。
AC代码(100分)
#include<bits/stdc++.h>
using namespace std;
/*思路:
1、将符合条件的超级幸运数和幸运数枚举并存起来
根据题意枚举的范围最小为a,最大为1002001
(备注:1000的平方是1000000,1001的平方是1002001)
2、然后按题意判断即可
*/
int a,n,x;
int main(){
cin>>a>>n;
//找符合条件的超级幸运数和幸运数并存起来
vector<int> v;//动态数组
for(int i=a;i<=1002001;i++){
int m=sqrt(i);
if(m*m==i){//如果i是完全平方数
for(int j=i;j<=1002001;j+=i){
v.push_back(j);//将符合要求的幸运数加入动态数组
}
}
}
//动态数组排序
sort(v.begin(),v.end());
while(n--){
cin>>x;
bool f=0;//标记是否找到
for(int i=0;i<v.size();i++){//遍历查找vector中是否有x
if(v[i]==x){
f=1;
cout<<"lucky"<<endl;
break;
}
}
if(f==0){//如果没有找到
for(int i=0;i<v.size();i++){
if(v[i]>x){
cout<<v[i]<<endl;
break;
}
}
}
}
return 0;
}
标签:le,洛谷,GESP202312,样例,lucky,000,五级,幸运,100 From: https://blog.csdn.net/weixin_66461496/article/details/145155039文末彩蛋: