Codeforces Round #772 (Div. 2) D. Infinite Set (动态规划+思维)
题目链接
https://codeforces.com/contest/1635/problem/D
题面
题意
输入一个n表示数组 aaa 的长度,然后输入一个 p,然后输入n个不同的元素,问在 [0,2p][0,2^p][0,2p]范围内有多少数 xxx 满足下列其中至少一种条件,包含满足条件的集合为 SSS :
- x=aix=a_ix=ai 在数组中
- x=2×y+1x=2\times y + 1x=2×y+1 并且 yyy 在 SSS 中
- 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 (动态规划+思维)相关推荐
- 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 ...
- Codeforces Round #590 (Div. 3) E. Special Permutations 差分 + 思维
传送门 文章目录 题意: 思路: 题意: 思路: 直接考虑比较难想,这种公式题基本都是将部分答案看成一个整体,考虑xi,xi+1x_i,x_{i+1}xi,xi+1的贡献的. 假设当前的xi=x, ...
- Codeforces Round #726 (Div. 2) F. Figure Fixing 二分图 + 思维
传送门 文章目录 题意: 思路 题意: 给你一张nnn个点mmm条边的图,每个点都有一个当前值aia_iai,目标值bib_ibi,每次可以选择一条边(i,j)(i,j)(i,j),将ai,aja ...
- 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)的子 ...
- Codeforces Round #636 (Div. 3) D. Constant Palindrome Sum 思维 + 差分
传送门 文章目录 题意: 思路: 题意: 思路: 首先有一个显然的性质就是每组操作最多不会超过两次. 很容易想到一个很暴力的思路,就是枚举x∈[1,2∗k]x \in [1,2*k]x∈[1,2∗k] ...
- Codeforces Round #631 (Div. 2) D. Dreamoon Likes Sequences 思维 + 组合数学
传送门 文章目录 题意: 思路: 题意: 给你d,modd,modd,mod,让你求能构造出如下序列aaa的个数模modmodmod: 思路: 首先可以发现aaa的长度不能超过log2dlog_2dl ...
- Codeforces Round #620 (Div. 2) E. 1-Trees and Queries 思维 + LCA
传送门 文章目录 题意 思路: 题意 思路: 照例,先考虑不加边怎么做.由于可以经过重复的边或点,设aaa与bbb之间长度为lenlenlen,那么需要len<=klen<=klen< ...
- Codeforces Round #772 (Div. 2) CF1635ABCDEF
1635A - Min Or Sum 回忆性题意:改变两个数,但 或 不能变,求整个数组最小和. 挺好想的,只要抓住或运算有一位就够了,并且答案的构造非常可行,就可以解决了. 答案证明给出了一个式子a ...
- Codeforces Round #349 (Div. 1) A. Reberland Linguistics 动态规划
A. Reberland Linguistics 题目连接: http://www.codeforces.com/contest/666/problem/A Description First-rat ...
最新文章
- TensorFlow教程之完整教程 2.7 字词的向量表示
- Linux环境:NFS--网络文件系统部署
- 菲波拉契数列(传统兔子问题)
- Linux系统之TroubleShooting(启动故障排除)
- Memento 备忘录 快照模式 MD
- 异常问题解决Error:Execution failed for task ‘:app:processDebugManifest‘
- 使用 WordPress 自定义字段功能为文章添加下载按钮
- linux vim替换指定字符串
- C# TextBox输入校验方法
- 解决SVN没有中文选项
- 门锁MCU OTA升级指导文档
- 小米平板4刷recovery教程_小米平板4解锁刷入魔趣详细教程 米板4怎么解锁刷机
- Hyper Flash 和 QSPI NOR Flash
- html模态框插件,如何使用JavaScript构建模态框插件
- OpenCV“迷雾”车道识别的反思
- 嵌入式C语言之零碎知识
- C语言中ASCII的应用
- 光盘映像文件的安装方法
- 西电2020 python OJ作业(50道题目,持续更新)
- nginx+createrepo搭建局域网yum源