文章目录

  • 题意
  • 思路

传送门

题意

给你一个集合SSS,初始集合内含有nnn个数,让后按照一下三个规则无限的向集合中添加数:

  1. 对于所有的1≤i≤n,x=ai1\le i\le n,x=a_i1≤i≤n,x=ai​都在集合中。
  2. 对于所有的x=2y+1,y∈Sx=2y+1,y\in Sx=2y+1,y∈S,都可以将xxx加入集合。
  3. 对于所有的x=4y,y∈Sx=4y,y\in Sx=4y,y∈S都可以将x加入集合。

问集合中小于2p2^p2p的数有多少个,对1e9+71e9+71e9+7取模。

1≤n,p≤2e5,1≤ai≤1e91\le n,p\le 2e5,1\le a_i\le 1e91≤n,p≤2e5,1≤ai​≤1e9

思路

ppp是2e52e52e5级别的,肯定是要找规律了,考虑两中操作对于二进制来说都发生了什么:

  1. 对于第二种操作,无非就是在二进制序列的最后加上了一个111,长度增加111。
  2. 对于第三种操作,无非就是在二进制序列的最后加上了两个000,长度增加222。

而小于2p2^p2p也就是小于等于ppp个111,所以就可以转换成将某个数xxx的二进制长度加到ppp的方案数,也就是个数了,这个可以由dp[i]=dp[i−1]+dp[i−2]dp[i]=dp[i-1]+dp[i-2]dp[i]=dp[i−1]+dp[i−2]的经典dpdpdp来得到,让后做一个前缀和,算一下dp[p−len(x)]dp[p-len(x)]dp[p−len(x)]就是答案了。

但是这样直接来会有重复的情况,但是我们发现如果找到根的话,让后就可以根据根来去重,对于每个数,能构成他的数最多有lognlognlogn个,所以我们直接找到他的所有父亲,拿mapmapmap去重一下即可。

由于用到了mapmapmap,所以复杂度O(nlog2n)O(nlog^2n)O(nlog2n)。

#include<bits/stdc++.h>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define Mid (tr[u].l+tr[u].r>>1)
#define pb push_back
using namespace std;const int N=1000010,INF=0x3f3f3f3f,mod=1e9+7;
typedef long long LL;int n,p;
int f[N],a[N];void solve() {f[1]=1; f[2]=2;for(int i=3;i<N;i++) f[i]=(f[i-1]+f[i-2])%mod;for(int i=2;i<N;i++) (f[i]+=f[i-1])%=mod;map<int,int>mp;scanf("%d%d",&n,&p);for(int i=1;i<=n;i++) {scanf("%d",&a[i]);}sort(a+1,a+1+n);LL ans=0;for(int i=1;i<=n;i++) {int val=a[i];bool flag=true;while(val) {if(mp.count(val)) flag=false;if(val&1) val>>=1;else if(val&3) break;else val>>=2;}if(!flag) continue;ans++;int cnt=(int)log2(a[i])+1;ans+=f[max(0,p-cnt)];if(p<cnt) ans--;ans+=mod;ans%=mod;mp[a[i]]=1;}printf("%lld\n",ans);
}int main() {int _=1;while(_--) {solve();}return 0;
}

CF 1635 D. Infinite Set 思维 + 二进制相关推荐

  1. CF 1475 F . Unusual Matrix 思维

    传送门 大体题意:给定两个矩阵a和b,给定一个操作,这个操作可以将a矩阵任意一行或者任意一列取反,问能否将a变成b. 乍一看不是一个很难的题,但是想我这样思维不好的还是看不出来什么东西.让后看到了题解 ...

  2. CF刷题笔记之思维切入篇--持续更新中

    1.一般的数学题以及推公式的题目,都可以从比较小的点切入,从n=1逐层扩大推导,寻找符合题意的某些性质,然后从特殊到一般,将这种性质用代码的思维描述出来,从而进行求解,即可较快的找到题目的切入点.例如 ...

  3. 洛谷 P2320 [HNOI2006]鬼谷子的钱袋 思维+二进制

    https://www.luogu.org/problem/P2320 题目描述 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政. 有一天,他在咸阳游历的时候,朋友告诉 ...

  4. Codeforces 1491 D. Zookeeper and The Infinite Zoo (二进制处理)

    解题前提 假设 u = 1010,则 v 可能为 1000.0010.1010.即对于 u 的每一位: a. u[i]为1,v[i]为1或0. b. u[i]为0,v[i]为0. 假设 u = 101 ...

  5. CF 915E. Physical Education Lessons 思维+set维护

    题意:初始有序列a为n个2,Q次操作. 操作1:将[l,r]的点变为1. 操作2:将[l,r]的点变为2. 在每次操作过后输出序列a有多少个2. n<=1e9 ,Q<=3e5. 将[l,r ...

  6. CF 1141E. Superhero Battle(思维)

    [题面] [题解] 题意:这是一个打怪兽的故事~给定怪兽初始体力值H和一个轮回的长度n,然后给定一个轮回中每一局怪兽体力的变动序列.输出第几局怪兽被打败即体力不大于0,若怪兽必胜则输出-1. 思路:难 ...

  7. CF - C. Number Game(思维,博弈)

    https://codeforces.com/contest/1749/problem/C 题意 给定一个长度为 n 的数组 a[]. 游戏开始之前,Alice 选择一个数字 k,表示进行 k 轮游戏 ...

  8. CF #826 (Div. 3) - D(思维,模拟),E(DP)

    E. Sending a Sequence Over the Network 题意 一个数列 a 可以构成若干个数列 b: 把数列 a 分成几段: 对于每一段,把其长度写到这一段的左边或者右边位置,构 ...

  9. 整数二进制补码的数学原理(two's complement)

    转载自整数二进制补码的数学原理(two's complement) ================================================================== ...

最新文章

  1. puppet 深入讲解
  2. 2017年计算机应用题库,2017年自学考试管理系统中计算机应用题库精选试题6
  3. 国内HuggingFace,预训练模型镜像使用
  4. proxool java_Java应用中使用Proxool
  5. Spring AOP原理浅析及入门实例
  6. Nginx 与 Tomcat,Apache的区别
  7. 自动驾驶——传感器的配置参数
  8. 向上转型---父类引用指向子类对象 A a = New B()的使用
  9. oracle mysql认证考试流程_oraclemysql认证考试流程
  10. JVM常见面试题及详解
  11. python华氏温度和摄氏温度相互转换
  12. 小米手机线刷USB3.0的问题
  13. 分析XBrowser地址栏使用案例
  14. unity占用太多c盘空间
  15. 在EXCEL中通过VBA实现批量读取文件夹内的文件名称
  16. 华为鸿蒙dba,人生中最重要的决策|读在职博士DBA
  17. 前端培训的机构哪个好,这五类人最适合转Web前端
  18. 翻译系统文本或者其他文本无法直接生成请求号(Request NO)解决方法(T-CODE:SLXT)
  19. MySQL调优之性能分析
  20. 逆水linux决服务器搭建教程,【教程攻略】智障式Linux服务器搭建教程

热门文章

  1. foreach循环符合就不往下走了_柴油发电机组冷却液循环故障解决方法
  2. 深入探讨编程到底需要知道多少数学知识
  3. Python 开发者的 6 个必备库
  4. 加载elementor时出现问题_不锈钢管在焊接时出现问题要怎么解决?
  5. 工业相机与民用相机的区别_工业相机和普通相机的区别详解
  6. hadoop安装hive及配置mysql_Hadoop系列之Hive(数据仓库)安装配置
  7. 件工程项目开发最全文档模板_一文带你了解微信小程序社区和小程序开发
  8. 超详细图解!【MySQL进阶篇】MySQL索引原理
  9. linux一键启动,Linux一键启动、停止、重启Tomcat sh脚本
  10. mysql表空间权限_MySQL InnoDB表空间加密示例详解