本题已自我实现。但仍归于无码专区

problem

求 ∑i=1n−1i⨁(n−i)\sum_{i=1}^{n-1}i\bigoplus (n-i)∑i=1n−1​i⨁(n−i)。

20%,n≤1e6;;50%,n≤1e9;;70%,n≤1e18;;100%,n≤1050020\%,n\le 1e6;;50\%,n\le 1e9;;70\%,n\le 1e18;;100\%,n\le 10^{500}20%,n≤1e6;;50%,n≤1e9;;70%,n≤1e18;;100%,n≤10500。

1s,128MB1s,128MB1s,128MB。

my idea

当看到 nnn 的数据范围且不取模的那一刻,我就知道大整数跑不掉了。

最基础 20%20\%20% ,直接暴力做。

会发现 i⨁(n−i)=(n−i)⨁ii\bigoplus (n-i)=(n-i)\bigoplus ii⨁(n−i)=(n−i)⨁i,所以其实上是 2∑i=1n−12i⨁(n−i)2\sum_{i=1}^{\frac{n-1}{2}}i\bigoplus (n-i)2∑i=12n−1​​i⨁(n−i) 大概这样的。

我曾试图每一位单独考虑,但很难下手。

直观地,我能感受到是 logloglog 的正解。

但由于对异或计算法则的不了解,我觉得自己并不能做出这道题来。

solution

i⨁(n−i)=(n−i)⨁i⇒2∑i=1n−12i⨁(n−i)i\bigoplus (n-i)=(n-i)\bigoplus i\Rightarrow 2\sum_{i=1}^{\frac{n-1}{2}}i\bigoplus (n-i)i⨁(n−i)=(n−i)⨁i⇒2∑i=12n−1​​i⨁(n−i),真的就是正解的关键所在。

如果我在考场上继续细想,应该是能找到规律的。

  • n=2k+1n=2k+1n=2k+1

    f(n)=∑i=1n−1i⨁(n−i)=2∑i=1k2i⨁(2k+1−2i)f(n)=\sum_{i=1}^{n-1}i\bigoplus (n-i)=2\sum_{i=1}^k2i\bigoplus(2k+1-2i)f(n)=∑i=1n−1​i⨁(n−i)=2∑i=1k​2i⨁(2k+1−2i)

    因为 2i,2k,2k−2i2i,2k,2k-2i2i,2k,2k−2i 均为偶数,所以每次异或,202^020 为是 111。

    ⇒f(n)=2∑i=1k2i⨁(2k−2i)+2k\Rightarrow f(n)=2\sum_{i=1}^k2i\bigoplus (2k-2i)+2k⇒f(n)=2∑i=1k​2i⨁(2k−2i)+2k

    参与异或的只有偶数,整体右移 111。

    ⇒f(n)=4∑i=1ki⨁(n−i)+2k\Rightarrow f(n)=4\sum_{i=1}^ki\bigoplus (n-i)+2k⇒f(n)=4∑i=1k​i⨁(n−i)+2k

    感觉很有机会转化成一半的子问题,把 i=ki=ki=k 提出来。

    ⇒f(n)=4∑i=1k−1i⨁(n−i)+4(k⨁0)+2k\Rightarrow f(n)=4\sum_{i=1}^{k-1}i\bigoplus (n-i)+4(k\bigoplus0)+2k⇒f(n)=4∑i=1k−1​i⨁(n−i)+4(k⨁0)+2k

    ⇒f(n)=4f(k)+6k\Rightarrow f(n)=4f(k)+6k⇒f(n)=4f(k)+6k

  • n=2kn=2kn=2k

    f(n)=∑i=1n−1i⨁(n−i)=∑i=1k2i⨁(2k−2i)+∑i=1k(2i−1)⨁(2k−2i+1)f(n)=\sum_{i=1}^{n-1}i\bigoplus (n-i)=\sum_{i=1}^k2i\bigoplus(2k-2i)+\sum_{i=1}^k(2i-1)\bigoplus(2k-2i+1)f(n)=∑i=1n−1​i⨁(n−i)=∑i=1k​2i⨁(2k−2i)+∑i=1k​(2i−1)⨁(2k−2i+1)

    ⇒f(n)=2f(k)+∑i=0k−1(2i+1)⨁(2k−2i−1)\Rightarrow f(n)=2f(k)+\sum_{i=0}^{k-1}(2i+1)\bigoplus(2k-2i-1)⇒f(n)=2f(k)+∑i=0k−1​(2i+1)⨁(2k−2i−1)

    ⇒f(n)=2f(k)+∑i=0k−1(2i+1)⨁[2(k−1)−2i+1]\Rightarrow f(n)=2f(k)+\sum_{i=0}^{k-1}(2i+1)\bigoplus[2(k-1)-2i+1]⇒f(n)=2f(k)+∑i=0k−1​(2i+1)⨁[2(k−1)−2i+1]

    2i+12i+12i+1 是奇数,2(k−1)−2i+12(k-1)-2i+12(k−1)−2i+1 也是奇数,所以异或后 202^020 二进制位一定是 000。

    那么就不管了,直接整体右移 111。

    ⇒f(n)=2f(k)+2∑i=0k−1i⨁(k−1−i)\Rightarrow f(n)=2f(k)+2\sum_{i=0}^{k-1}i\bigoplus(k-1-i)⇒f(n)=2f(k)+2∑i=0k−1​i⨁(k−1−i)

    感觉很有机会转化成一半的子问题,把 i=0,i=k−1i=0,i=k-1i=0,i=k−1 提出来。

    ⇒f(n)=2f(k)+4(k−1)+2∑i=1k−2i⨁(k−1−i)\Rightarrow f(n)=2f(k)+4(k-1)+2\sum_{i=1}^{k-2}i\bigoplus(k-1-i)⇒f(n)=2f(k)+4(k−1)+2∑i=1k−2​i⨁(k−1−i)

    ⇒f(n)=2f(k)+2f(k−1)+4k−4\Rightarrow f(n)=2f(k)+2f(k-1)+4k-4⇒f(n)=2f(k)+2f(k−1)+4k−4

直接记忆化搜索,最后就是要写大整数加减乘除赋值了。

trick
因为我曾试图用 map<Int,Int> 来记录 f[n]f[n]f[n],但是没写过。
重载 SLT 内部运算真的搞崩了。
所以我将字符串进行了自然溢出的 hash
map<ull,Int> 就不用管重载 map< 了。
最后就是空间比较小,我写的是数组,不是 vector 存大数。
只知道 1000 太小,1500 太大。

code

#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
struct Int {int len, v[1300]; ull Hash;Int() { len = 1; memset( v, 0, sizeof( v ) ); }Int( int x ) { memset( v, 0, sizeof( v ) ); v[len = 1] = x; calc(); }void read() {char s = getchar(); len = 0;while( '0' <= s and s <= '9' ) {v[++ len] = s ^ 48;s = getchar();}reverse( v + 1, v + len + 1 );}void print() { for( int i = len;i;i -- ) printf( "%d", v[i] ); puts(""); }void calc() { Hash = 1; for( int i = 1;i <= len;i ++ ) Hash = Hash * 131 + v[i]; }Int operator + ( Int x ) {Int ans;int ip = 1;while( ip <= len or ip <= x.len ) {ans.v[ip + 1] = ( v[ip] + x.v[ip] + ans.v[ip] ) / 10;ans.v[ip] = ( v[ip] + x.v[ip] + ans.v[ip] ) % 10;ip ++;}while( ip > 1 and ! ans.v[ip] ) ip --;ans.len = ip;ans.calc();return ans;}Int operator - ( int k ) {Int ans;Int x( k );int ip = 1;while( ip <= len or ip <= x.len ) {ans.v[ip] = v[ip] - x.v[ip];if( ans.v[ip] < 0 ) v[ip + 1] --, ans.v[ip] += 10;ip ++;}while( ip > 1 and ! ans.v[ip] ) ip --;ans.len = ip;ans.calc();return ans;}Int operator * ( int x ) {Int ans;ans.len = len + 1;for( int i = 1;i <= len;i ++ ) {ans.v[i + 1] = ( ans.v[i] + v[i] * x ) / 10;ans.v[i] = ( v[i] * x + ans.v[i] ) % 10;}while( ans.len > 1 and ! ans.v[ans.len] ) ans.len --;ans.calc();return ans;}Int operator / ( int x ) {Int ans; int k = 0;ans.len = len;for( int i = len;i;i -- ) {k = ( k << 1 ) + ( k << 3 ) + v[i];ans.v[i] = k / x;k %= x;}while( ans.len > 1 and ! ans.v[ans.len] ) ans.len --;ans.calc();return ans;}Int operator = ( Int x ) {len = x.len;Hash = x.Hash;memcpy( v, x.v, sizeof( x.v ) );return *this;}};
map < ull, Int > f;Int dfs( Int n ) {if( f.count( n.Hash ) ) return f[n.Hash];if( n.len == 1 and ( n.v[1] == 1 or n.v[1] == 0 ) ) return (Int)0;if( n.v[1] & 1 ) f[n.Hash] = dfs( n / 2 ) * 4 + n / 2 * 6;else f[n.Hash] = dfs( n / 2 ) * 2 + dfs( n / 2 - 1 ) * 2 + n * 2 - 4;return f[n.Hash];
}signed main() {freopen( "rox.in", "r", stdin );freopen( "rox.out", "w", stdout );Int n;n.read(); dfs( n ).print();return 0;
}

【无码专区11】异或2(结论 / 推式子 + 哈希hash + 大整数高精度 加减乘除重载考察)相关推荐

  1. 【无码专区4】幸运数字4(折半搜索+计数+结论)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  2. 【无码专区13】最小公倍数(线段树)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 my idea顾名思义,记录了我的整个思维过程,以及自己部分实现细节口胡,还有期望分数 solution才是dls正解,但是因为只 ...

  3. 【无码专区7】括号序列(思维)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  4. 【无码专区5】01串(大讨论+构造)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  5. 【无码专区3】乘法表的解密破译

    因为只有std,没有自我实现,所以是无码专区 problem 给定一个 qqq 进制的乘法表,每个字符代表着 0∼p−10\sim p-10∼p−1 不同的数字. 求每个字符代表的数字.保证有解. × ...

  6. 【无码专区12】子集和(背包dp)

    此题已自我实现,但仍归于无码专区 本题在考场上就过了,所以难度并不高,发现性质即可. problem 有 nnn 个正整数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,... ...

  7. 【无码专区10】第K大查询(双向链表 /主席树+st表)

    已自我实现,但还是归入无码专区序列.哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考. problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l+1≥ ...

  8. 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  9. 【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

最新文章

  1. sap与外部系统的接口怎么实现
  2. ASP.NET中WebForms简介与搭建HelloWorld项目
  3. python 基础之字符串方法
  4. 如何破解Synplify Pro 9.6.2? (SOC) (Synplify)
  5. springboot : Failed to decode downloaded font 和 OTS parsing error
  6. DFS建立准备之基于windows 2008 R2的第二台域控建立
  7. php array_search多条件,php使用array_search与array_column函数实现二维数组内元素查找...
  8. python的常用函数模块_(5)Python的常用模块函数
  9. SQL 单表查询多个计算的值
  10. 小学计算机说课稿模板,小学信息技术说课稿模板
  11. Bilibili拜年祭启发的小小探索
  12. linux一句话精彩问答 (转贴)
  13. Linux shadow文件
  14. 三星显示器 测试软件,3D+TV+APP!三星27英寸LED显示器全国首测
  15. [开箱即用]一个用PHP实现的文字翻译,支持谷歌、百度、小牛翻译sdk(工厂抽象模式)
  16. 一次失败的S32K模拟EEPROM经历
  17. 中间件常见安全漏洞(转载)
  18. 接口测试基础python+requests
  19. 也谈Eclipse未自动在gen目录下生成R.java
  20. Android App 可以定时启动! 并且完成短信自动发送获取内容功能 (以获取闪讯密码为例 大学宿舍宽带)

热门文章

  1. 每日一笑 | 实名举报校长拿两份工资!
  2. 鉴别一个人是否 js 入门的标准竟然是?!
  3. python第k序列元素查找_Python寻找第k小的元素
  4. python中def和return是必须使用的保留字吗_Python 保留字和关键字的用法
  5. vue从url中获取token并加入到 请求头里_BATJ都会用到的接口鉴权cookie、session 和token...
  6. 奥的斯服务器状态显示,奥的斯电梯调试服务器(俗称st)按键介绍
  7. python用pandas提取行列_python- pandas 不删除符合条件的行和列
  8. 获取两个数据的交集_MySQL交集和差集的实现方法
  9. mysql java驱动 ibm_JDBC驱动汇总
  10. 使用Microsoft Word2016无法正常对Latex文本转换的踩坑和解决方法