比赛的时候有个地方忘记取模怒砍80,调了一下午Orz(虽然我总共貌似就打这个比赛半个多小时

我们一眼看到涉及到公约数/同余 和 xor,所以我们想到了一些关于xor的性质

a+b >= a xor b >= b-a (b>a),而且ab不相等所以就是求a xor b = b - a的数对数

但是我们看到n<=1e18,这玩意怎么求???

我们从异或的性质入手 发现a xor b = b - a的充要条件就是a & b = b

也就是我们考虑a,b作为两个二进制集合,则a是b的真子集

然后我们发现就是求Σ2^popcount(i)-1,这个好像是数位DP的套路,但是我怎么会数位DP

于是我找了一波规律

i     0 1 2 3 4 5 6 7

pop     0 1 1 2 1 2 2 3

value  0 1 1 3 1 3 3 7

发现这个数列是个类似分形的东西,每次把pop复制到后面再整体+1,然后我就觉得可以搞

这个玩意又像倍增又像二分又像分治(但是又啥都不像 (其实像格雷码

我们预处理出前(1<<k)个数的贡献和,然后用一个变量cnt来记录此前的popcount,我们发现cnt对答案的贡献是可以暴力计算的,于是就做完了(雾

这个玩意虽然写了一堆 但是思路肥肠好想

我好像写的不是正解,因为他们算贡献直接用子集的子集就给整出来了

时间复杂度O(log^2 N)

代码:

#include <cstdio>
#include <iostream> using namespace std; #define int long long int inline int read() {
int x=0,f=1;
char cr=getchar();
while (cr>'9' || cr<'0') {
if (cr=='-') f=-1;
cr=getchar();
}
while (cr>='0' && cr<='9') {
x=(x<<3)+(x<<1)+cr-'0';
cr=getchar();
}
return x*f;
} const int mod=1e9+7; int ans[70]; inline void init() {
ans[0]=0;
for (int i=1;i<=63;i++) ans[i]=(ans[i-1]*3ll+(1ll<<i-1ll))%mod;
} inline int calc(int cnt,int num) {
int val=ans[num];
while (cnt--) val*=2ll,val+=(1ll<<num),val%=mod;
return val;
} signed main() {
init();
int n=read();
int res=0,cnt=0;
for (int i=63;i>=0;i--) {
if (n&(1ll<<i)) {
res+=calc(cnt,i),res%=mod;
cnt++;
}
}
res+=(1ll<<cnt)-1ll,res%=mod;
printf("%lld",res);
}

最新文章

  1. Stream与byte[]与Image与string
  2. 玩转JavaScript OOP[0]&mdash;&mdash;基础类型
  3. Android 中布局设置导致的TextView不显示的问题
  4. 为Kindeditor控件添加图片自动上传功能
  5. ThinkPHP 3.2.3 多模块 和 多应用 的配置
  6. MyBatis学习总结(一)
  7. javascript对象(2)
  8. winform中利用反射实现泛型数据访问对象基类(1)
  9. c函数调用过程原理及函数栈帧分析
  10. Dynamics CRM2013 用户进入系统所必需的那些权限
  11. SQL Server 深入解析索引存储(堆)
  12. C# Params的使用
  13. Linux系列教程(五)——Linux常用命令之链接命令和权限管理命令
  14. 【二十九】php之简易微信二维码支付
  15. Oracle用分区表分区交换做历史数据迁移
  16. 【转】Linux进程绑CPU核
  17. JSTL 、 OGNL 与 EL
  18. iOS网络缓存的系统实现是一个烂尾工程
  19. Spring MVC 学习 之 - 配置简单demo
  20. android sliding menu

热门文章

  1. 安装完 Ubuntu 16.04.1,重启出现[sda] Assuming drive cache: write through的问题
  2. Maven与Nexus
  3. 吴裕雄--天生自然TensorFlow2教程:手写数字问题实战
  4. Ubuntu 12.10 安装vim出错
  5. __str__()方法和__repr__()方法
  6. 【SSM】AppFileUtils
  7. Educational Codeforces Round 74 (Rated for Div. 2)E(状压DP,降低一个m复杂度做法含有集合思维)
  8. 树莓派4B踩坑指南 - (6)安装常用软件及相关设置
  9. SpringMVC中在Controller类的每个方法执行前调用某个方法的实现
  10. 15、python面对对象之类和对象