首页 > 其他分享 >P8540 「Wdoi-2」夜空中的 UFO 恋曲 题解

P8540 「Wdoi-2」夜空中的 UFO 恋曲 题解

时间:2024-07-29 10:31:51浏览次数:16  
标签:UFO 题解 奇数 Wdoi 末尾 偶数 2c operatorname lowbit

hanghangakioi

考试的时候在乱猜结论,交了几遍就过了,证明当然是赛后才想的()

文中加粗部分是需要读者稍微思考一下原因的地方 (不是重点)


先考虑一下样例二,将 \(10^{18}\) 化成二进制:\(1101...001000000000000000000\)。

其实只需要知道末尾有 \(18\) 个 \(0\) 就行了,因为在 \(x\) 变为 \(x^{2c}\) 时,后面 \(18\) 个 \(0\) 就会变成 \(18\times 2c\) 个 \(0\),如果再异或 \(c\),就相当于把末尾的几位变成 \(c\),此时除了末尾上的 \(c\),\(x^{2c}\oplus c\) 的前面部分的数已经不会影响结果了(因为最后求 \(\operatorname{lowbit}\) 就只关心末几位的值)。所以每做一次操作,末几位都是 \(c\),那么最后的 \(\operatorname{lowbit}\) 就是 \(\operatorname{lowbit}(c)\)。

再扩展到一般情况:

  • \(c\) 是偶数,\(a\) 是奇数,那么二进制中的最后一位就始终都是 \(1\),所以最后的 \(\operatorname{lowbit}\) 就是 \(1\)。

  • \(c\) 是偶数,\(a\) 是偶数,这个就和样例二差不多:\(a\) 的二进制末尾至少有一个 \(0\),\(a^{2c}\) 的末尾就至少有 \(2c\) 个 \(0\),肯定比 \(c\) 的二进制的位数多,异或 \(c\) 就相当于把末尾的几位变成 \(c\),又因为 \(c\) 是偶数,所以 \(a^{2c}\oplus c\) 的末尾也至少有一个 \(0\),又变成了开始的情况,只不过末几位是 \(c\) 而不是 \(a\)。一直推下去,最后的 \(\operatorname{lowbit}\) 就是 \(\operatorname{lowbit}(c)\)。

  • \(c\) 是奇数,此时根据 \(a\) 的奇偶又分成两种情况:

    • \(a\) 是偶数,和前面一样:\(a^{2c}\) 的末尾至少有 \(2c\) 个 \(0\),异或 \(c\) 就相当于把末尾的几位变成 \(c\),因为我们只关心末几位,所以就可以把原数看成 \(c\)
    • \(a\) 是奇数,那么 \(a^{2c}\) 也是奇数,因为 \(c\) 也是奇数,奇数异或奇数就变成了偶数,然后又变成了上一个情况,即奇偶交替。
    • 如果最后的数是个奇数,那么 \(\operatorname{lowbit}\) 就是 \(1\)。
    • 如果最后是个偶数,那么就要考虑倒数第二步。因为 \(b>1\),所以倒数第二步的数的二进制末尾一定是 \(c\),那么最后答案就相当于 \(\operatorname{lowbit}(c^{2c}\oplus c)\)。

其实做到这就已经做完了,但是 \(\operatorname{lowbit}(c^{2c}\oplus c)\) 还可以化简一下。

考虑用二项式定理展开 \(c^{2c}\):

\[c^{2c}=(c-1+1)^{2c}=\sum_{i=0}^{2c} C_{2c}^{i}\times (c-1)^i=1+2c(c-1)+C_{2c}^{2}\times (c-1)^2+...+(c-1)^{2c} \]

我们将上式所有项按 \(\operatorname{lowbit}\) 大小来排序,最小的两项当然是 \(1\) 和 \(2c(c-1)\),因为 \(c-1\) 是偶数,所以 \(\operatorname{lowbit}(2c(c-1))=\operatorname{lowbit}(c-1)\times 2\)

从第三项开始,所有项的 \(\operatorname{lowbit}\) 都不小于 \(\operatorname{lowbit}(c-1)\times 2\),所以 \(c^{2c}\) 一定可以被表示为 \(k\times \operatorname{lowbit}(2(c-1))+1\),其中 \(k\in N^+\)。

形象点,把 \(c^{2c}\) 和 \(c\) 的二进制分别表示出来(随便一个例子,只需要看后五位):

\(c^{2c}\):\(1101...1010001\)

\(c\): \(\ \ 1010...0101001\)

可以发现,最末尾的 \(1\) 会抵消,但倒数第二位不会,所以 \(\operatorname{lowbit}(c^{2c}\oplus c)=\operatorname{lowbit}(c-1)\)。

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
ll a,b,c;
ll lb(ll x){return x&-x;}
int main()
{
    cin >> a >> b >> c;
    if(c&1)
    {
        if((a&1)^(b&1))cout << 1; //ab不同奇偶,那么最后答案就是奇数
        else cout << lb(c-1); //ab同奇偶,最后答案就是偶数
    }
    else cout << ((a&1)?1:lb(c));
    return 0;
}

标签:UFO,题解,奇数,Wdoi,末尾,偶数,2c,operatorname,lowbit
From: https://www.cnblogs.com/max0810/p/18329546

相关文章

  • CF1906C Cursed Game 题解
    题目大意交互库有一个\(3\times3\)的01矩阵\(a\),每次询问一个\(n\timesn\)的01矩阵\(b\),交互库会返回一个\((n-2)\times(n-2)\)的01矩阵\(c\),满足:\[c_{x,y}=\bigoplus\limits_{1\lei,j\le3}\left(a_{i,j}\operatorname{AND}b_{x+i-1,y+j-1}\right......
  • 梦熊十三连测第三场题解
    T1本题考察了数论的相关知识。30pts暴力枚举每次洗牌的情况,时间复杂度为\(O(n^2)\)。60pts首先卡牌\(1\)和\(2n\)一直不动,可以不用考虑这两张牌。将位置和剩下的牌上的数字全减\(1\),那么数字为\(k\)的牌操作一次后就会到\(2k\bmod(2n-1)\)的位置。那么问题相当......
  • Maximum Glutton题解
    正常动规,但是赛时死了。分析看到\(n\)很小,但是\(X\)和\(Y\)有点大,所以状态稍微改变一下。设\(dp_{i,j}\)表示已经选到第\(j\)个,且甜度为\(i\)时咸度的最小值。转移方程为:\[dp_{j,k}=\min_{0\lek\lei,a_i\lej\leX}(dp_{j,k},dp_{j-a_i,k-1}+b_i)\]按照\(i,j......
  • CF526G Spiders Evil Plan 题解
    Description给定一棵\(n\)个节点的无根树,每条边有边权。有\(q\)次询问,每次询问给出\(x,y\),你需要选择\(y\)条树上的路径,使这些路径形成一个包含\(x\)的连通块,且连通块中包含的边权和最大。\(n,q\le10^5\),强制在线。Solution考虑只有一组询问怎么快速求答案。容......
  • 【科大讯飞笔试题汇总】2024-07-27-科大讯飞秋招提前批(研发岗)-三语言题解(Cpp/Java/
    ......
  • ABC364 DEF 题解
    ABC364DEF题解D-K-thNearest题目链接赛时想了一个(也许确实是对的)做法,但是代码太难写,一直没写出来……看了官方题解才发现正解其实也很简单……本题最关键的一点是要转换思路:与其考虑“离某个点第\(k\)近的点在哪”,不如考虑“离某个点距离不超过\(x\)的点有多少个”。......
  • 会员购项目面试题解析:高效数据抓取与异常处理
    会员购项目亮点日志记录信息协程异步抓取数据,大大提高抓取速度捕获异常,并添加重试机制源码importloggingimporttimeimportrequestsimportasyncioimportaiohttpfromaiohttpimportContentTypeErrorimportcsv#配置日志logging.basicConfig(level=logging......
  • C++题解(17) 狐猬编程: 640.线段覆盖
    题目描述在一条数轴上,有N条线段,第i条线段的左端点是s[i],右端点是e[i]。如果线段有重叠(即使是端点重叠也算是重叠),则输出“impossible”,如果没有重叠则输出“possible”。输入格式输入文件名:640.in多组测试数据。第一行,一个整数G,表示有G组测试数据。1<=G<=10。每组......
  • [题解]ABC364 A~F
    A-GluttonTakahashi给定\(n\)道菜,每道菜要么是甜的(用sweet表示),要么是咸的(用salty表示)。必须按顺序吃,如果连续吃到\(2\)个甜的菜,就会浑身难受吃不下去了。请问是否能吃完这些菜。按题意模拟即可,只要前\(n-1\)个元素中有连续的sweet就输出No。点击查看代码#include<bits/s......
  • CF292D 题解
    \(O(mk\alpha(n))\)暴力,考虑对于每个询问\(l,r\),枚举\(1\siml-1,r+1\simm\),并查集连边即可。1154ms。\(O(n(m+k\alpha(n)))\)我们发现枚举\(i\in[1,l),j\in(r,m]\)太慢了。考虑先预处理出并查集从\(1\)连边到编号为\(id\)的边的状态\(pre_{id}\),倒过来再处理出......