1 条题解

  • 0
    @ 2025-8-24 22:49:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar FallingFYC_
    但我仍然渴望在每一次追忆之旅中留下闲暇时间,在一个场景前驻足,在岁月的朦胧里瞭望过去的自己,感受尽可能多的甜蜜。

    搬运于2025-08-24 22:49:16,当前版本为作者最后更新于2023-08-13 21:21:56,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    原题


    分析&思路

    观察题目给出的数列,可以发现除第一,二个数外,每个数都等于上一个数乘 22,因此,除了第一,二个数,每个数必须都是偶数。所以,我们可以根据 xx 的奇偶性来分讨:

    1. xx 为奇数

      xx 必定为第一或第二个数,要使结果最小 xx 需要是第一个数,而乘 22 的次数为 n2n - 2 次(除了第一,二个数),因此结果为 x×2n2x \times 2^{n - 2}

    2. xx 为偶数

      也可以根据如上方法先算出第一个数,再根据如上柿子式子计算出结果,得到第一个数只要让 xx 不断除以二直到除成奇数为止,原因如上,但同时也要满足当前遍历过的数字个数小于等于 nn,用一个变量记录,注意初始值设成 22xx 和前两个数中的一个,因为前两个数一样,一共是两个数)。

    注意:不开 long long 见祖宗。


    代码

    #include <bits/stdc++.h>
    using namespace std;
    int t , n , x;
    int main()
    {
    	cin >> t;
    	while (t--)
    	{
    		cin >> n >> x;
    		long long ans;
    		if (x % 2) ans = x * pow(2 , (n - 2));
    		else
    		{
    			int tx = x , sum = 2;
    			while (!(tx % 2) && sum < n) {tx /= 2; ++sum;}
    			ans = tx * pow(2 , (n - 2));
    		}
    		cout << ans << endl;
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    8939
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者