LUOGU P6034 Ryoku与最初之人笔记 简要题解
比赛的时候有个地方忘记取模怒砍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);
}
LUOGU P6034 Ryoku与最初之人笔记 简要题解的更多相关文章
- IOS懒人笔记应用源码
这个源码是懒人笔记应用源码,也是一个已经上线的apple应用商店的应用,懒人笔记iOS客户端源码,支持语音识别,即将语音转化成文本文字,所用语音识别类库为讯飞语音类库. 懒人笔记是一款为懒人设计的笔记 ...
- 【luogu P1774 最接近神的人_NOI导刊2010提高(02)】 题解
题目链接:https://www.luogu.org/problemnew/show/P1774 归并排序求逆序对. #include <cstdio> #define livelove ...
- luogu P1774 最接近神的人_NOI导刊2010提高(02)
题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...
- [luogu] P4823 [TJOI2013]拯救小矮人(贪心)
P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...
- Luogu P4823 [TJOI2013]拯救小矮人
题目 \(n^2\)的dp已经成为辣鸡做法了,%%%wch. 首先一个结论:\(a+b\)小的人在上. 这个东西我们有三种方法解决证明: 1.感性理解,\(a+b\)越大的人逃生能力越强,放在下面就越 ...
- 认识python-个人笔记篇
认识python 1 .python 的发展历史 一种广泛使用的解释型.高级编程.通用型编程语言,由"龟叔"吉多·范罗苏姆创造,第一版发布于1991年. Python的设计哲学强调 ...
- 【luogu P2919 [USACO08NOV]守护农场Guarding the Farm】 题解
题目链接:https://www.luogu.org/problemnew/show/P2919 1.搜索的时候分清楚全局变量和局部变量的区别 2.排序优化搜索 #include <cstdio ...
- 【luogu P1825 [USACO11OPEN]玉米田迷宫Corn Maze】 题解
题目链接:https://www.luogu.org/problemnew/show/P1825 带有传送门的迷宫问题 #include <cstdio> #include <cst ...
- 【luogu P3931 SAC E#1 - 一道难题 Tree】 题解
题目链接:https://www.luogu.org/problemnew/show/P3931 肉眼观察题目感觉可以跑最大流. 证明是如果拆断一棵树,可以最小割,最小割等于最大流. 注意: 图是无向 ...
随机推荐
- 【转】shell处理mysql增删改查
这几天做一个任务,比对两个数据表中的数据,昨天用PHP写了一个版本,但考虑到有的机器没有php或者php没有编译mysql扩展,就无法使用mysql系列的函数,脚本就无效了,今天写个shell版本的, ...
- 【Hibernate 多对多】
HibernateManytoMany public class HibernateManytoMany { //演示维护第三张表 @Test public void testTable2() { S ...
- LinkQueue(链队)
今天学习了队列,因为前面写了好几个链表实现的数据结构基本上都懂了,然后大致了解了一下队列的特点,便决定用自己的理解来实现一个,然后实现了. (2018-02-14 代码更新) Head file: # ...
- Java实现大批量数据导入导出(100W以上) -(三)超过25列Excel导出
前面一篇文章介绍大数据量导出实现: Java实现大批量数据导入导出(100W以上) -(二)导出 这篇文章在Excel列较少时,按以上实际验证能很快实现生成.但如果列较多时用StringTemplat ...
- i.MX RT600之DSP调试环境搭建篇
恩智浦的i.MX RT600是跨界处理器产品,同样也是i.MX RTxxx系列的开山之作.不同于i.MX RT1xxx系列单片机,i.MX RT600 采用了双核架构,将新一代Cortex-M33内核 ...
- 「JSOI2010」挖宝藏
「JSOI2010」挖宝藏 传送门 由于题目中说道挖一个位置的前提是挖掉它上面的三个,以此类推可以发现,挖掉一个点就需要挖掉这个点往上的整个倒三角,那么也就会映射到 \(x\) 轴上的一段区间(可以发 ...
- selenium webdriver 实现百度贴吧自动签到
public static void main(String[] args) { //TestUtils.killProcess("javaw.exe"); TestUtils.k ...
- selenium webdriver 操作select
@Test public void test() { WebDriver driver=ExplorerBase.IESetting(); driver.get("http://unique ...
- git pull解决冲突
git报错:Please commit your changes or stash them before you merge. 解决:1.不需要保留本地修改的话,直接将有冲突的文件还原再pull:g ...
- [蓝桥杯2015初赛]生命之树(树状dp)
在X森林里,上帝创建了生命之树.他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值.上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 ...