???--???二进制变换

题意 :

定义两种变换 

1 : i = i - 1

2 : i = i - lowbit (i)

 

定义函数Calc(i,j)为二进制意义下 i 变换到 j 的最小步数。

给你一个二进制整数 n,要求 sigma {(i = 1 -> n) sigma {(j = 0 -> i - 1) Calc (i,j)}}

数据范围 : 

令n的长度为len

len <= 1000000

-----------------------------------------------此后一千里-----------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

首先有一个很显然的性质,就是如果 i 用了2操作之后还比 j 大的话,那么一定用2操作,因为减去lowbit不比减去1差

我们设 f(n) = sigma {(i = 0 -> n-1) Calc (n,i)},

我们考虑将n按位处理掉,设t(n)为n只保留的二进制最高位的数,我们发现对于Calc (n,i) 如果 t(n) == t(i) 那么答案显然是 Calc (n-t(n),i-t(i))

而如果 t(n)!=t(i) 那么我们无论如何要把 n 变换到 i 都必须把 n 变换到 t(n) ,而显然 t(n)!=t(i) 的 i 有 t(i) 个.

所以我们便可以将 f(n) 拆分掉得到 f(n) = t(n) * (BitCount(n) - 1) + f( n - t(n)),我们可以一直拆下去,也就是说我们只用算2的整次幂的 f 就可以了。

假设我们已经求出2的0-3次幂,要求 f (10000) , 因为除了变换到0,10000变换到任何数都要先变换到1111,所以我们可以得到下式 :

f(10000) = f(1111) + 1111 - 4 + 1 减4加1意思是去掉1111变到0的代价,加上10000变到0的代价

我们将f(1111) 再展开即可得到 f 关于2的整次幂的递推式,前缀和优化一下可以O(n)预处理

设 g(n) = sigma{(i = 1 -> n) f(i)},g(n)求的实际上就是答案

我们还是考虑去按位处理掉

g(n) = $\sum \limits_{i = 1}^{t(n)-1} f(i) + \sum \limits_{i = t(n)}^{n} f(i)$

  = $g(t(n) - 1) + \sum \limits_{i = t(n)}^{n} f(i)$

我们考虑将后面sigma中的 f(i) 中的 f(t(n)) 及t(n)相关的常数项全部提取出来,那么后面就可以提取出 (n-t(n)+1) 个 f(t(n)),常数项的话先暂时用k(n-t(n))表示,提取后剩下的部分就是 g(n-t(n))。

然后g(n) = g(t(n) - 1) + (n-t(n)+1)*f(t(n)) + k(n-t(n)) + g(n-t(n))

如果我们可以处理 k(n-t(n)) 和 g(t(n) - 1) 的话,就可以在复杂度要求内得出解了

我们考虑如何去求 k ,观察后发现 k 函数的实际意义可以表达为 k(n) = $\sum \limits_{i = 0}^{n} BitCount(i)$

用和 g 相似的手法,我们也可以把 k 给拆分到只于2的整次幂减1项相关

因为我们常数项的系数就是BitCount()的和

当n=2^a - 1时我们把式子变形得到k(n) = $\sum \limits_{i = 1}^{a} \binom{a}{i} * a = a * 2^{a - 1}$就很好处理了

然后我们发现 g 的2的整次幂减1是也可以方便预处理的,也是相似的手法,就不再赘述了

然后就可以预处理f,g,k,然后就可以计算答案了

计算答案时可以从后往前很方便的计算 

代码 :

/*
Lelouch vi Britannia here commands you , all of you , die !
*/
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define low(x) ((x)&(-(x)))
#define LL long long
#define eps 1e-9
#define MOD 1000000007
using namespace std;#define int int
inline int Max(int a,int b) {return a>b?a:b;}
inline int Min(int a,int b) {return a<b?a:b;}
inline int Abs(int a) {return a>0?a:-a;}
inline int Sqr(int a) {return a*a;}
#undef int#define MAXN 1000006int n;
LL f[MAXN],g[MAXN],k[MAXN],two[MAXN],md[MAXN],uk[MAXN],ug[MAXN];
char s[MAXN];void Pre(int n) {two[1]=1;g[1]=1;f[1]=1;k[1]=1;f[2]=2;for(int i=2;i<=n;i++) two[i]=two[i-1]*2%MOD;for(int i=3;i<=n;i++) f[i]=(2*f[i-1]+(i-1)*two[i-1]-1)%MOD;for(int i=2;i<=n;i++) k[i]=(k[i-1]*2+two[i])%MOD;for(int i=2;i<=n;i++) g[i]=(g[i-1]*2+two[i]*f[i]+k[i-1]*two[i])%MOD;for(int i=1;i<=n;i++) {md[i]=(md[i-1]+(s[n-i]=='1'?two[i]:0))%MOD;uk[i]=(uk[i-1]+(s[n-i]=='1'?md[i-1]+1+k[i-1]:0))%MOD;ug[i]=(ug[i-1]+(s[n-i]=='1'?md[i-1]*f[i]%MOD+f[i]+uk[i-1]*two[i]%MOD+g[i-1]:0))%MOD;}
}int main() {scanf("%s",s);n=strlen(s);Pre(n);printf("%lld\n",ug[n]);return 0;
}
/*
Hmhmhmhm . That's right , I am killer.
*/
View Code

 

转载于:https://www.cnblogs.com/ihopenot/p/6606954.html

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

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

相关文章

C# 派生类的构造函数

假定没有为任何类定义任何显式的构造函数,这样编译器就会为所有的类提供默认的初始化构 造函数,在后台会进行许多操作,但编译器可以很好地解决类的层次结构中的所有问题,每个类中 的每个字段都会初始化为对应的默认值。但在添加了一个我们自己的构造函数后,就要通过派生类 的层…

js 获取url问号前_PHP获取指定网页的HTML代码并执行输出

PHP获取指定网页的HTML代码并执行输出&#xff0c;这个方法主要是将所要或取目标的URL地址的网站中获取相关内容到自己的网页中。代码如下&#xff1a;<?php $srcurl "所要截取目标的URL地址"; $handle fopen($srcurl,"rb"); $content fread($handl…

AD16画线时如何切换90°、45°、任意角度画线模式

在绘图界面选择画线后&#xff0c;使用“shift空格”可切换不同的画线模式。切换过程中会有90模式、45度模式、任意角度模式等&#xff0c;在这些模式中可使用空格键在进行细分切换。 1、90模式 2、45模式 3、任意模式

1200兆路由器网速_如何选购路由器才能发挥宽带的网速?

很多人多少都会遇到家里宽带网速慢的时候&#xff0c;家中明明是光纤宽带&#xff0c;可是网速却没有想象中的那么快&#xff1f;尤其是宽带的带宽升级到100M、200M、500M的时候&#xff0c;感觉跟没有提速一样。也许你家的路由器该换新啦&#xff01;那么&#xff0c;想要选购…

C# 静态类

------《C#高级编程》第7版

学习曾国藩,学做人做事学技术

三个字&#xff1a;诚、勤、恒早期&#xff1a; 早起、耐烦、有恒 语录&#xff1a;不日进&#xff0c;就日退 语录&#xff1a;拙看似慢&#xff0c;实则最快&#xff01; &#xff08;反思学技术&#xff1f;&#xff09; 语录&#xff1a; 决定成败的&#xff0c;不在高处…

vant实现下拉刷新和上拉加载_微信小程序 - 实现下拉刷新、上拉加载

在小程序开发中使用下拉刷新和上拉加载非常多&#xff0c;比如常用的展示型首页&#xff0c;而实现这个功能有两种形式&#xff0c;第一种是使用 scroll-view 组件&#xff0c;第二种是不使用 scroll-view 组件而让整个页面刷新&#xff0c;那就分别都在此简单分享下。方法一在…

经验证过的跨线程更新辅助类MyInvokeHelper

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Windows.Forms;namespace Extension.MyDll {/// <summary>/// 辅助类&#xff1a;跨线程更新控件/// &l…

02函数-03-闭包

1、闭包的概念闭包是一种特殊的程序结构&#xff0c;即 函数A中定义了另一个函数a&#xff0c;内部函数a引用了外部函数A的参数和局部变量&#xff0c;最终A会返回一个保存了相关参数和变量的函数a。简洁地说&#xff0c;外层函数将保存了信息的可执行内层函数作为结果返回。来…

mapper同时添加数据只能添加一条_springcloud项目搭建第二节:eureka+数据库

在上一节搭建的项目基础上&#xff0c;在父项目spring-cloud的pom文件中添加mapper启动器和mysql驱动的配置&#xff0c;如果项目中使用lombok也可以引用&#xff0c;这里需要注意的是lombok引用的配置不在dependencyManagement结构中&#xff0c;这时为什么呢&#xff0c;因为…

C#控件命名规范

类 型 前 缀 示 例 Adrotator adrt adrtTopAd BulletedList blst blstCity Button btn btnSubmit Calendar cal calMettingDates CheckBox chk chkBlue CheckBoxList chkl chklFavColors DropDownList drop dropCountries FileUpLoad fup fupImage …

在centOS7.2里安装virtualenv和flask

1&#xff09; 安装pip工具 #wget https://bootstrap.pypa.io/get-pip.py #python get-pip.py 2&#xff09; 安装virtualenv&#xff0c;并创建一个开发环境 #pip install virtualenv #mkdir rongtangzi #创建一个项目 #cd rongtangzi #virtualenv env1 #…

事务连接中断_一文搞懂分布式事务-CAP理论

互联网系统中&#xff0c;分布式事务是无法避免的&#xff0c;目前多数解决方案是BASE理论&#xff0c;最终一致性&#xff0c;结合事务补偿。1.什么是CAP理论。CAP理论&#xff0c;又称为布鲁尔定理&#xff0c;是加州大学伯克利分校的计算机科学家埃里克.布鲁尔(Eric Brewer)…

C# WinForm中获取当前程序运行目录的方法

C# WinForm中获取当前程序运行目录的方法&#xff1a; “AppDomain.CurrentDomain.BaseDirectory”:获取当前应用程序所在目录的路径&#xff0c;最后包含“\”&#xff1b;“System.Threading.Thread.GetDomain().BaseDirectory”:获取当前应用程序所在目录的路径&#xff0c…

网络攻防 第四周学习总结

教材学习内容总结 第四章主要介绍了网络嗅探和协议分析网络嗅探是一种常用的窃听技术&#xff0c;它利用计算机的网络接口截获目的地为其他计算机的数据报文&#xff0c;以监听数据流中所包含的用户账户密码或私密信息等。 网络嗅探具有很强的隐蔽性&#xff0c;往往让网络信息…

获取内存_如何获取一个进程所占用的内存

推荐观看&#xff1a;BATJ面试官最喜欢问的&#xff1a;多线程、线程并发面试题详解&#xff08;volatileThreadLocalSleep&#xff09;_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com通过 ps 可以获知一个进程所占用的内存$ ps -O rss -p 3506PID RSS S TTY …

461. Hamming Distance【数学|位运算】

2017/3/14 15:23:55 The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given two integers x and y, calculate the Hamming distance. 题目要求&#xff1a;求两个数字二进制位中同一位置不同bit的个数…

中的ama格式_想发SCI?期刊引用格式选好了没?

我~芳~老师~又回来开坑了哈哈哈哈哈&#xff01;&#xff01;&#xff01;对于一心想要冲向SCI、EI顶峰&#xff0c;拉都拉不住的同学来说&#xff0c;我们需要把论文中的每一个细节都抠得死死的。合乎规范地引用科学期刊&#xff08;Scientific Journal&#xff09;绝对是最重…

着陆攻击LAND Attack

着陆攻击LAND Attack着陆攻击LAND Attack也是一种拒绝服务攻击DOS。LAND是Local Area Network Denial的缩写&#xff0c;意思是局域网拒绝服务攻击&#xff0c;翻译为着陆攻击只是一种错误的理解。攻击原理为&#xff0c;攻击机向目标机发送一个SYN的TCP包&#xff0c;包中的源…

伺服怎么接单相220伏_乐利网带你认识伺服电机及工作原理

什么是伺服电机&#xff0c;应该听过人的不少&#xff0c;没听过的也占不少数&#xff0c;其实&#xff0c;伺服电机是指在伺服系统中控制机械元件运转的发动机&#xff0c;是一种补助马达间接变速装置。伺服电机可使控制速度&#xff0c;位置精度非常准确&#xff0c;可以将电…