【LGR-151-Div.2】洛谷 8 月月赛 II & YsOI2023 T1
解题思路
设有一序列 a,其中 a1 = a2,第 k( ≥ 3) 项为前 k-1 项的前缀和。可以发现前 q 项分别为第一项的 20 倍,20 倍,21 倍,22 倍,23 倍…2q-3 倍,2q-2 倍。
扩展到整个序列中,可得第 i( ≥ 3) 项一定为 2i-2a1。要保证 an 尽量小,就可以让 x 出现的位置尽量靠后。
那么可以让 i 从 n-2 开始枚举,每次减1。如果 x 能被 2i 整除,说明 x 最后也只能是序列中第 i+2 个数(前面多减了一个2);再从 i+3 开始循环到 n,依次乘2,乘到 n 次就是 an 的最小值了。当然,如果 n = 2,则直接输出 x 就好啦。
注意:乘起来的结果可能会很大,要开 long long。
代码实现
1 #include<bits/stdc++.h> 2 using namespace std; 3 int T; 4 int main() { 5 for (cin >> T; T --;){ 6 int n; 7 long long x; 8 cin >> n >> x; 9 if (n == 2){ 10 cout << x << endl; 11 continue; 12 } 13 for (int i = n - 2; ; i --) 14 if (!(x % (1 << i))){ 15 for (int j = i + 3; j <= n; j ++) 16 x <<= 1; // 左移1,相当于乘2 17 cout << x << endl; 18 break; 19 } 20 } 21 return 0; 22 }标签:洛谷,前缀,YsOI2023,int,题解,long,P9532 From: https://www.cnblogs.com/vectorSpace-blog/p/17628163.html