题目链接

https://codeforces.com/contest/1635/problem/D

题面

题意

输入一个n表示数组 aaa 的长度,然后输入一个 p,然后输入n个不同的元素,问在 [0,2p][0,2^p][0,2p]范围内有多少数 xxx 满足下列其中至少一种条件,包含满足条件的集合为 SSS :

    1. x=aix=a_ix=ai​ 在数组中
    1. x=2×y+1x=2\times y + 1x=2×y+1 并且 yyy 在 SSS 中
    1. x=4×yx=4\times yx=4×y 并且 yyy 在 SSS 中

输出满足条件的个数,并对 109+710^9+7109+7 取模

思路

我们来观察这三种条件:

  • 对于第一种条件,表示我们基础的 SSS 集合
  • 对于第二种条件,我们会发现就是将其二进制下的位数末尾添加了一个 1
  • 对于第三种条件,我们会发现其实就是将其二进制的位数末尾添加了两个 0

我们再对 2p2^p2p 转化为二进制实际上就是一个小于等于 ppp 个2的二进制数,那么我们就可以将问题转化为某个数的二进制长度的方案数,由于我们的两种操作一种是增加一位,另一种是增加两位,那么长度数量的状态转移方程就是 f[i]=f[i−1]+f[i−2]f[i] = f[i-1] + f[i-2]f[i]=f[i−1]+f[i−2] 也就是一个斐波那契数列,那么对于一个数 xxx 其延申长度小于 ppp 位的时候有 ∑i=1p−len(x)f[i]\sum_{i=1}^{p-len(x)}{f[i]}∑i=1p−len(x)​f[i] 这么多种,但是如果我们直接对每一个数进行这样计算的话是不行的,因为有重复的情况,所所以我们开一个 mapmapmap ,记录我们是否以及对这个数进行了计算,详情请看代码

代码

#include<bits/stdc++.h>
using namespace std;#define ll long long #define mod 1000000007const int N = 2e5 + 10;ll a[N],n,p,f[N]={0,1,2};void slove(){cin>>n>>p;for(int i = 1;i <= n; ++i) cin>>a[i];sort(a+1,a+1+n);map<ll,bool> vis;ll ans = 0;for(int i = 1;i <= n; ++i) {ll k = a[i];bool fg = true;while(k){if(vis[k]) fg = false;if(k & 1) k >>= 1;//如果是奇数,那么说明是2y+1else if(k % 4 == 0) k >>= 2;//如果是4的倍数,那么说明是4yelse break;//如果上述两种情况都不算,那么说明此时不能延申}if(!fg) continue;ll len = (ll)log2(a[i]) + 1LL;if(p >= len)ans = (ans + f[max(0LL,p-len)] + 1) % mod;vis[a[i]] = true;}cout<<ans<<endl;
}int main()
{int t;t = 1;for(int i = 3;i < N; ++i) f[i] = (f[i-1] + f[i-2]) % mod;for(int i = 1;i < N; ++i) f[i] = (f[i-1] + f[i]) % mod;while(t--) slove();return 0;
}

Codeforces Round #772 (Div. 2) D. Infinite Set (动态规划+思维)相关推荐

  1. Codeforces Round #772 (Div. 2) C. Differential Sorting(思维+构造)

    题目链接 https://codeforces.com/contest/1635/problem/C 题面 题意 给你一个长度为n的数组 a[i]a[i]a[i] ,我们有一种操作让 a[x]=a[y ...

  2. Codeforces Round #590 (Div. 3) E. Special Permutations 差分 + 思维

    传送门 文章目录 题意: 思路: 题意: 思路: 直接考虑比较难想,这种公式题基本都是将部分答案看成一个整体,考虑xi,xi+1x_i,x_{i+1}xi​,xi+1​的贡献的. 假设当前的xi=x, ...

  3. Codeforces Round #726 (Div. 2) F. Figure Fixing 二分图 + 思维

    传送门 文章目录 题意: 思路 题意: 给你一张nnn个点mmm条边的图,每个点都有一个当前值aia_iai​,目标值bib_ibi​,每次可以选择一条边(i,j)(i,j)(i,j),将ai,aja ...

  4. Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 思维 + 逆序对

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的串a,ba,ba,b,每次可以同时翻转a,ba,ba,b中任意一段长度为L(1≤L≤n)L(1\le L\le n)L(1≤L≤n)的子 ...

  5. Codeforces Round #636 (Div. 3) D. Constant Palindrome Sum 思维 + 差分

    传送门 文章目录 题意: 思路: 题意: 思路: 首先有一个显然的性质就是每组操作最多不会超过两次. 很容易想到一个很暴力的思路,就是枚举x∈[1,2∗k]x \in [1,2*k]x∈[1,2∗k] ...

  6. Codeforces Round #631 (Div. 2) D. Dreamoon Likes Sequences 思维 + 组合数学

    传送门 文章目录 题意: 思路: 题意: 给你d,modd,modd,mod,让你求能构造出如下序列aaa的个数模modmodmod: 思路: 首先可以发现aaa的长度不能超过log2dlog_2dl ...

  7. Codeforces Round #620 (Div. 2) E. 1-Trees and Queries 思维 + LCA

    传送门 文章目录 题意 思路: 题意 思路: 照例,先考虑不加边怎么做.由于可以经过重复的边或点,设aaa与bbb之间长度为lenlenlen,那么需要len<=klen<=klen< ...

  8. Codeforces Round #772 (Div. 2) CF1635ABCDEF

    1635A - Min Or Sum 回忆性题意:改变两个数,但 或 不能变,求整个数组最小和. 挺好想的,只要抓住或运算有一位就够了,并且答案的构造非常可行,就可以解决了. 答案证明给出了一个式子a ...

  9. Codeforces Round #349 (Div. 1) A. Reberland Linguistics 动态规划

    A. Reberland Linguistics 题目连接: http://www.codeforces.com/contest/666/problem/A Description First-rat ...

最新文章

  1. TensorFlow教程之完整教程 2.7 字词的向量表示
  2. Linux环境:NFS--网络文件系统部署
  3. 菲波拉契数列(传统兔子问题)
  4. Linux系统之TroubleShooting(启动故障排除)
  5. Memento 备忘录 快照模式 MD
  6. 异常问题解决Error:Execution failed for task ‘:app:processDebugManifest‘
  7. 使用 WordPress 自定义字段功能为文章添加下载按钮
  8. linux vim替换指定字符串
  9. C# TextBox输入校验方法
  10. 解决SVN没有中文选项
  11. 门锁MCU OTA升级指导文档
  12. 小米平板4刷recovery教程_小米平板4解锁刷入魔趣详细教程 米板4怎么解锁刷机
  13. Hyper Flash 和 QSPI NOR Flash
  14. html模态框插件,如何使用JavaScript构建模态框插件
  15. OpenCV“迷雾”车道识别的反思
  16. 嵌入式C语言之零碎知识
  17. C语言中ASCII的应用
  18. 光盘映像文件的安装方法
  19. 西电2020 python OJ作业(50道题目,持续更新)
  20. nginx+createrepo搭建局域网yum源

热门文章

  1. tensorflow 中的 array_ops
  2. tensorflow/pytorch 设置GPU的使用
  3. Python操作Oracle
  4. php7.0-fpm.sock
  5. sql server 高可用故障转移(1)
  6. 1045. Favorite Color Stripe (30)
  7. java 中的异步回调
  8. Spring常用注解,自动扫描装配Bean
  9. 机器学习自学札记(1)
  10. 微信小程序wx.request请求服务器json数据并渲染到页面