博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Contest20180122]超级绵羊异或
阅读量:6118 次
发布时间:2019-06-21

本文共 1791 字,大约阅读时间需要 5 分钟。

题意:求$a\ xor\left(a+b\right)xor\cdots xor\left(a+b\left(n-1\right)\right)$

对每一位求答案,第$k$的答案是$\sum\limits_{i=0}^{n-1}\left\lfloor\dfrac{a+bi}{2^k}\right\rfloor$,这是类欧几里得算法中的一个

类欧几里得算法:求$f\left(a,b,c,n\right)=\sum\limits_{i=0}^n\left\lfloor\dfrac{ai+b}{c}\right\rfloor$

①若$a\geq c$或$b\geq c$,我们可以把它除出来,原式$=\dfrac{n\left(n+1\right)}{2}\left\lfloor\dfrac{a}{c}\right\rfloor+\left(n+1\right)\left\lfloor\dfrac{b}{c}\right\rfloor+f(a\%c,b\%c,c,n)$

②若$a\lt c$且$b\lt c$,令$m=\left\lfloor\dfrac{an+b}{c}\right\rfloor$

原式

$\begin{align*}&=\sum\limits_{i=0}^n\sum\limits_{j=1}^m\left[\left\lfloor\dfrac{ai+b}{c}\right\rfloor\geq j\right]\\&=\sum\limits_{i=0}^n\sum\limits_{j=0}^{m-1}\left[\left\lfloor\dfrac{ai+b}{c}\right\rfloor\geq j+1\right]\\&=\sum\limits_{i=0}^n\sum\limits_{j=0}^{m-1}\left[ai+b\geq cj+c\right]\\&=\sum\limits_{i=0}^n\sum\limits_{j=0}^{m-1}\left[ai\gt cj+c-b-1\right]\\&=\sum\limits_{i=0}^n\sum\limits_{j=0}^{m-1}\left[i\gt\left\lfloor\dfrac{cj+c-b-1}{a}\right\rfloor\right]\end{align*}$

因为$i,j$独立,所以两个求和符号可以换过来

$\begin{align*}&=\sum\limits_{j=0}^{m-1}\sum\limits_{i=0}^n\left[i\gt\left\lfloor\dfrac{cj+c-b-1}{a}\right\rfloor\right]\\&=\sum\limits_{j=0}^{m-1}\left(n-\left\lfloor\dfrac{cj+c-b-1}{a}\right\rfloor\right)\\&=mn-f\left(c,c-b-1,a,m-1\right)\end{align*}$

$a,c$每次递归要么被①削成余数,要么被②交换位置,类似欧几里得算法,复杂度也是一样的

边界是$a=0$

那么我们现在可以快速求原来的式子了

本题其实就是在模$2$的意义下求答案

#include
#define ll long longll f(ll a,ll b,ll c,ll n){ if(a==0)return(b/c*(n+1))&1; if(a>=c||b>=c)return((a/c*n*(n+1)/2)&1)^((b/c*(n+1))&1)^f(a%c,b%c,c,n); ll m=(a*n+b)/c; return((n*m)&1)^f(c,c-b-1,a,m-1);}int main(){ int t,i,n,a,b; ll ans; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&a,&b); ans=0; for(i=0;i<60;i++)ans|=(f(b,a,1ll<
<

转载于:https://www.cnblogs.com/jefflyy/p/8337406.html

你可能感兴趣的文章
如何为你的网站设置404页面(转)
查看>>
通过gradle运行测试脚本(转)
查看>>
什么是快速排序(转)
查看>>
C语言中输入输出格式控制
查看>>
什么是区块链
查看>>
武汉区块链开发公司谈区块链应用
查看>>
Monkeyrunner学习记录之环境搭建
查看>>
[android] 手机卫士自定义对话框布局
查看>>
吃豆子(Packman)
查看>>
进入页面,根据后台传过来的flag 判断列表隐藏与否
查看>>
用css3写出来的进度条
查看>>
px rem css 转换工具
查看>>
PHP中输出字符串(echo,print,printf,print_r和var_dump)的区别【转载】
查看>>
Java线程池的选择
查看>>
01背包问题的贪婪算法
查看>>
所有的链接借鉴
查看>>
Linux驱动开发相关
查看>>
Ubuntu 16.04开启SSH服务
查看>>
部署vue项目到阿里云服务器(Ubuntu16.04 64位)
查看>>
DataTable转换为实体集合
查看>>