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

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

problem

∑i=1n−1i⨁(n−i)\sum_{i=1}^{n-1}i\bigoplus (n-i)i=1n1i(ni)

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%,n1e6;;50%,n1e9;;70%,n1e18;;100%,n10500

1s,128MB1s,128MB1s,128MB

my idea

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

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

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

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

直观地,我能感受到是 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(ni)=(ni)i2i=12n1i(ni),真的就是正解的关键所在。

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

  • 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=1n1i(ni)=2i=1k2i(2k+12i)

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

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

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

    ⇒f(n)=4∑i=1ki⨁(n−i)+2k\Rightarrow f(n)=4\sum_{i=1}^ki\bigoplus (n-i)+2kf(n)=4i=1ki(ni)+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)+2kf(n)=4i=1k1i(ni)+4(k0)+2k

    ⇒f(n)=4f(k)+6k\Rightarrow f(n)=4f(k)+6kf(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=1n1i(ni)=i=1k2i(2k2i)+i=1k(2i1)(2k2i+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=0k1(2i+1)(2k2i1)

    ⇒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=0k1(2i+1)[2(k1)2i+1]

    2i+12i+12i+1 是奇数,2(k−1)−2i+12(k-1)-2i+12(k1)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)+2i=0k1i(k1i)

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

    ⇒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(k1)+2i=1k2i(k1i)

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

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

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模板:常系数齐次线性递推(线性代数、多项式)

所谓常系数齐次线性递推&#xff0c;就是系数为常数的齐次线性递推。 &#xff08;逃&#xff09; 前言 sto Asta orz&#xff01; 又是一个名字高大上&#xff0c;实则小清新的算法&#xff01; 解析 考虑一个 k 次的线性递推&#xff1a; an∑i1kfian−ia_n\sum_{i1}^kf_…

2021牛客暑期多校训练营1

2021牛客暑期多校训练营1 题号题目知识点难度AAlice and Bob博弈论BBall Dropping计算几何签到CCut the TreeDDetermine the Photo Position签到EEscape along Water PipeFFind 3-friendly Integers真签到GGame of Swapping Numbers思维题&#xff0c;推导HHash FunctionFFT&a…

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

此题已自我实现&#xff0c;但仍归于无码专区 本题在考场上就过了&#xff0c;所以难度并不高&#xff0c;发现性质即可。 problem 有 nnn 个正整数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​&#xff0c;他们的和为 mmm。你想对于其每一个子集 SSS&#xff0c;求出他…

Penguins

Penguins 题意&#xff1a; 有两个20*20的地图&#xff0c;有障碍物&#xff0c;两个地图各有一个小人&#xff0c;左侧地图的小人要从右下角走到右上角&#xff0c;右侧地图的小人要从左下角走到左上角&#xff0c;这两个小人是镜像移动的&#xff0c; 左侧小人右侧小人左移…

盲盒(随机概率 + 最大公约数)

盲盒problemsolutioncodeproblem 有 2n2n2n 个盲盒&#xff0c;每个盲盒有一个惊喜值 aia_iai​。 打开恰好 nnn 个盲盒&#xff0c;获得的惊喜值为这些盲盒惊喜值的最大公约数。 求能获得的最大惊喜值。 n≤1e5,ai≤1e12n\le 1e5,a_i\le 1e12n≤1e5,ai​≤1e12。 solution…

P5354 [Ynoi2017] 由乃的 OJ(树剖、位运算)

前言 当暴力思路与题解中的“暴力”不同时&#xff0c;继续想优化往往就渐行渐远了… 所以当没有头绪时&#xff0c;要勇于跳出原有的转化&#xff01; 这种位运算类型的优化似乎始终不在我的寄存器中…需要加强&#xff01; 解析 不难想到按位考虑的 O(nklog⁡2n)O(nk\log…

在 .NET Core 中运行 JavaScript

一.前言在 .NET Framework 时&#xff0c;我们可以通过V8.NET等组件来运行 JavaScript&#xff0c;不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core &#xff0c;我们如何在 .NET Core 中运行 JavaScript 呢&#xff0c;答案是使用 NodeServices。关于为何有在 .N…

I love exam HDU - 6968

I love exam HDU - 6968 题意&#xff1a; 有n个考试科目&#xff0c;现在有m套复习资料&#xff0c;每套复习资料需要花费wi天使用&#xff0c;用完提升ci的分数&#xff0c;现在还有t天复习时间&#xff0c;挂科数目不能超过p&#xff0c;问所有达到的最大分数 题解&#…

[CF1442 D] Sum(分治优化dp + 结论)

CF1442D Sumproblemsolutioncodeproblem luogu翻译 solution 部分分做法&#xff0c;预处理每组前缀和&#xff0c;暴力背包 dpdpdp 转移&#xff1a;dpi,jmax⁡{dpi−1,j−ksumi(k)∣0≤k≤l[i]}dp_{i,j}\max\Big\{dp_{i-1,j-k}sum_i(k)\ \Big|\ 0\le k\le l[i]\Big\}dpi,j…

P4338 [ZJOI2018]历史(树剖)(暴力)

前言 有点懊恼的一个题… 并没有其他那些ZJOI那么毒瘤&#xff0c;看出了关键结论&#xff0c;但最后维护卡在log条虚边的伞兵性质上了。 解析 第一眼&#xff1a;感觉根本不可做啊。 冷静一下&#xff0c;既然它还变态的带修&#xff0c;一定是可以转化成比较形式化的东西的…

Named Volume 在 MySQL 数据持久化上的基本应用

原文作者&#xff1a;春哥非常感谢春哥的投稿&#xff0c;同时也有一些感慨。初识春哥时&#xff0c;春哥是美术设计大咖。后不久&#xff0c;创业并致力于游戏开发&#xff0c;已有3年。从Unity3D到IOS&#xff08;Swift&#xff09;开发&#xff0c;从前端开发到后端以及容器…

Codeforces Round #723 (Div. 2)

Codeforces Round #723 (Div. 2) 题号题目知识点AMean Inequality签到BI Hate 1111思维CPotions (Easy Version)思维C1Potions (Hard Version)思维DKill Anton思维逆序对EOolimry and Suffix ArrayFMedian Queries CF1526A Mean Inequality 题意&#xff1a; 给你一个序列a&…

[AtCoder Regular Contest 060] E - Tak and Hotels

AT2039 [ARC060C] 高橋君とホテル / Tak and Hotelsproblemsolution - 分块code - 分块solution - 倍增code - 倍增problem luogu翻译 solution - 分块 肯定刚开始&#xff0c;我们很想暴力跳过去。事件复杂度取决于数据。 肯定不做把头拿给别人砍的事 这种跳法&#xff0…

模板:珂朵莉树

所谓珂朵莉树&#xff0c;就是珂朵莉发明的树。 &#xff08;逃 前言 在数据随机且带区间推平操作时适用&#xff0c;此时所有操作的期望颜色段数都是 O(log⁡n)O(\log n)O(logn) 的&#xff0c;可以使用暴力解决即可。 暴力即优雅。 解析 利用 set 维护颜色段&#xff1a;…

.Netcore 2.0 Ocelot Api网关教程(7)- 限流

本文介绍Ocelot中的限流&#xff0c;限流允许Api网关控制一段时间内特定api的总访问次数。限流的使用非常简单&#xff0c;只需要添加配置即可。1、添加限流修改 configuration.json 配置文件&#xff0c;对 UpstreamPathTemplate 为 /webapib/values 的配置修改如下&#xff1…

cf1526 C Potions

cf1526 C Potions 题意&#xff1a; n个药剂&#xff0c;每个药剂可以加/减能量&#xff0c;一开始能量为0&#xff0c;从左往右开始进行&#xff0c;全程能量不为负&#xff0c;问最多可以使用几个药剂 本题有简单(n<2000),困难模式(n≤200000) 题解&#xff1a; 简单题…

[CF 526 F] Pudding Monsters(单调栈 + 线段树)

CF526F Pudding Monstersproblemsolutioncodeproblem luogu翻译 solution observation &#xff1a;每行每列恰好有一个棋子&#xff0c;所以如果一段区间 [l,r][l,r][l,r] 会被某个 kkk 统计&#xff0c;当且仅当这个区间内棋子纵坐标 ymax−ymin1r−l1y_{max}-y_{min}1r-l…

微信开发必看,使用.Net Core 开发微信跨平台应用

.NET Core 是一个开源通用的开发框架&#xff0c;源码由微软官方和社区共同支持。支持跨平台&#xff0c;即支持在 Window&#xff0c;macOS&#xff0c;Linux 等系统上的开发和部署&#xff0c;并且可以在硬件设备&#xff0c;云服务&#xff0c;和嵌入式/物联网方案中进行使用…

P5590 赛车游戏(差分约束)

前言 9月做的题现在不会了&#xff1f;&#xff1f;&#xff1f; 越学越拉了属于是。 解析 设 disxdis_xdisx​ 表示 1-x 的最小距离&#xff0c;那么一条 u->v 的边的边权就是 disv−disudis_v-dis_udisv​−disu​。 差分约束即可。 挂掉的坑点&#xff1a;只需要考虑…

CF1526 D. Kill Anton

CF1526 D. Kill Anton 题意&#xff1a; 给你一个由’A’,‘N’.‘T’,O’四个字符组成的字符串b&#xff0c;现在要求你改变b的顺序得到a&#xff0c;使得a通过移动回到b的步数最多。 每次移动只能移动相邻两项 题解&#xff1a; 官方题解说&#xff1a;最佳情况为相同字符…