难度:普及-
题目背景
Ysuperman 模板测试的试机题。
小心立秋,小心秋丽。
题目描述
立秋有一个长度为 n 的数组 a,所有数字都是正整数,并且除了其中第一个数字以外其它数字都等于前面所有数字的和。
例如,数组 [1,1,2,4,8,16] 就有可能是立秋有的一个数组,因为除了第一个数字 1,后面的每个数字都是前面数字的和,例如:
- 第二个数字 1=1。
- 第三个数字 2=1+1。
- 第四个数字 4=1+1+2。
- 第五个数字 8=1+1+2+4。
- 第六个数字 16=1+1+2+4+8。
现在立秋告诉了秋丽数字 x 存在于这个数组中,秋丽希望知道 an 最小会是多少,或者说整个数组最后一个数字最小有多少。
输入格式
本题有多组测试数据。
输入第一行一个数字 T 表示测试数据组数。
接下来 T 行每行两个正整数 n,x。
输出格式
输出共 T 行,分别表示每组测试数据的答案。
对于某组数据 n,x,输出一行一个正整数表示可能的最小的 an。
输入输出样例
输入 #1
3 2 2 3 2 4 2
输出 #1
2 2 4
输入 #2
3 3 1 3 2 3 4
输出 #2
2 2 4
输入 #3
3 2 6 3 6 4 6
输出 #3
6 6 12
输入 #4
3 3 3 3 6 3 12
输出 #4
6 6 12
说明/提示
样例 1 解释
- 第一组数据只有唯一可能的数组 [2,2],所以答案为 2;
- 第二组数据有两种可能的数组,分别是 [2,2,4] 和 [1,1,2],所以答案为 2;
- 第三组数据有两种可能的数组,分别是[2,2,4,8] 和 [1,1,2,4],所以答案为 4。
样例 2 解释
- 第一组数据只有唯一可能的数组 [1,1,2],所以答案为 2;
- 第二组数据有两种可能的数组 [1,1,2] 和 [2,2,4],所以答案为 2;
- 第三组数据有两种可能的数组 [2,2,4] 和 [4,4,8],所以答案为 4。
数据范围
对于前 30% 的数据,满足 x 不能被 2 整除,或者说 2 不是 x 的一个因数,或者说 x 是奇数。
另有 30% 的数据,满足 x 可以被 2n−2 整除,或者说 2n−2 是 x 的一个因数。
另有 20% 的数据,满足 x≤1000,可以证明在这个数据范围下答案可以使用一个 int
类型变量存储。
对于 100% 的数据,满足 1≤T≤10^4,2≤n≤20,1≤x≤10^9。
思路
贪心算法
完整代码
#include<bits/stdc++.h>//T4
using namespace std;
long long t,n,x,a[25];
int main(){
cin>>t;
//freopen("a.in","r",stdin);
//freopen("b.out","w",stdout);
long long sum=1;
for(int i=0;i<=18;i++){
a[i]=sum;
sum*=2;
}
while(t--){
cin>>n>>x;
long long pre=x;
while(1){
if(pre%a[n-2]==0){
cout<<pre<<endl;
break;
}
else pre*=2;
}
}
return 0;
}