当前位置: 首页 > news >正文

哪里有零基础网站建设教学网购平台推广方案

哪里有零基础网站建设教学,网购平台推广方案,wordpress 喜欢按钮,山东济南市网站建设D. Infinite Set https://codeforces.com/contest/1635/problem/D 题目描述 你有一个由不同正整数组成的数组和一个无限集 S,现在你需要往集合 S 中塞入所有符合 x x x 条件的数。 x x x 的条件(满足其中任意一个即可): x a i …

D. Infinite Set

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

题目描述

你有一个由不同正整数组成的数组和一个无限集 S,现在你需要往集合 S 中塞入所有符合 x x x 条件的数。

x x x 的条件(满足其中任意一个即可):

  1. x = a i ( 1 ≤ i ≤ n ) x = a_i(1\leq i\leq n) x=ai(1in)
  2. x = 2 y + 1 ( y ∈ S ) x = 2y + 1 (y \in S) x=2y+1(yS) y y y 必须在 S 集合中)
  3. x = 4 y ( y ∈ S ) x = 4y (y \in S) x=4y(yS) ($y $ 必须在 S 集合中)

求无限集 S 中所有小于 2 p 2^p 2p 的个数。

输入描述

第一行包含两个整数 n 和 p (1≤n,p≤2⋅105)。

第二行包含 n 个整数 a1,a2,…,an (1≤ai≤109)。

保证 a 中的所有数字都是不同的。

输出描述

打印一个整数,即 S 中严格小于 2p 的元素数。 请记住以 109+7 为模打印。

样例

#1

2 4
6 1
9

#2

4 7
20 39 5 200
14

#3

2 200000
48763 1000000000
448201910

提示

在第一个示例中,小于 24 的元素是 {1,3,4,6,7,9,12,13,15}。

在第二个例子中,小于 27 的元素是 {5,11,20,23,39,41,44,47,79,80,83,89,92,95}。

解析

有一说一,二进制的题目我确实没写过…,一时间也只能想到暴力,可这样不可能过,后面看大佬题解,发现要用二进制…

**Tips:**以后但凡看到这种 2 p 2^p 2p 次幂的形式,要往二进制想想。

根据二进制, x x x 的第二和第三条件可以转为:

  1. 第一条件其实就是 A 数组的所有元素均属于 S
  2. 2 x + 1 2x+1 2x+1 相当于 2 < < 1 2 << 1 2<<1 然后加 1 1 1 (向后添加一个 1)
  3. 4 x 4x 4x 相当于 4 < < 2 4 << 2 4<<2 (向后添加两个 0)

题目要我们求 S 中所有小于 2 p 2^p 2p 的数,其实就是求对应的二进制最高位 1 的后面 0 的变化,例如 p = 3 p=3 p=3 时,对应二进制为 1000 1000 1000 ,我们可以得到且不保证符合的有 0000 、 0100 、 0110 、 0111 、 0010 、 0011 、 0001 0000、0100、0110、0111、0010、0011、0001 0000010001100111001000110001

通过上面的例子,我们发现,只是 1 后面的 0 发生了变化,而我们的规则是要么增加一个 1,要么增加两个0(这0是一起添加的,不能分开)。

我们假设一个数为 x x x ,那么我们可以得到:

x x x 增加位数得到的不同的数
0 x x x1
1 x 1 x1 x11
2 x 00 、 x 11 x00、x11 x00x112
3 x 001 、 x 100 、 x 111 x001、x100、x111 x001x100x1113
4 x 0000 、 x 1100 、 x 0011 、 x 1111 、 x 1001 x0000、x1100、x0011、x1111、x1001 x0000x1100x0011x1111x10015

上表意思:一个数的二进制在其后面增加若干位数,每次只能增加一个 1 或两个 0 ,那么最终得到的不同的数有多少个。

并且能发现,无论如何变化,它们都保证是唯一的。

看得出来这是个斐波那契数列 F [ i ] = F [ i − 1 ] + F [ i − 2 ] F[i] = F[i-1] + F[i-2] F[i]=F[i1]+F[i2] ,这里表示一个数增加 i i i 位可以得到的不同数的数量为 F [ i ] F[i] F[i] 个。

我们现在只是求了一个数增加若干位若得到的不同数,并没有将前面的也算进来,所以还需要对其做一个前缀和 p r e f i x [ i ] = p r e f i x [ i − 1 ] + F [ i ] prefix[i] = prefix[i-1] + F[i] prefix[i]=prefix[i1]+F[i] ,此时定义变为 p r e f i x [ i ] prefix[i] prefix[i] 表示增加 i i i 位后所得到的所有不同数。

最后需要注意若一个数 a i a_i ai 可以由另外一个数得到 a j a_j aj ,因此为了不重复计算,所以只保留 a i a_i ai ,例如 A 有 2, 8 两个元素,8 可以通过 2 得到,因此我们只保留 2 即可。

2:0010

8:1000

0010 可以通过一次变化(即在尾部加两个 0 )==> 001000 ==> 1000

AC Code

public class Main {static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));public static void main(String[] args) throws Exception {final int MOD = 1000000000 + 7;final int MAX = 200005;int n = nextInt(), p = nextInt(), ans = 0;int[] A = new int[MAX];int[] F = new int[MAX];int[] prefix = new int[MAX];F[0] = F[1] = 1;prefix[0] = 1; prefix[1] = 2;HashMap<Integer, Boolean> map = new HashMap<>();for(int i = 2; i < MAX; i++) {F[i] = (F[i-1] + F[i-2]) % MOD;prefix[i] = (prefix[i-1] + F[i]) % MOD;}for(int i = 1; i <= n; i++) {A[i] = nextInt();map.put(A[i], true);}// 对数组元素进行去重for(int i = 1; i <= n; i++) {int x = A[i];while(x != 0) {if(x % 2 == 1) x >>= 1; // 条件2,末尾加 1else if(x % 4 == 0) x >>= 2; // 条件3,末尾加两个 0else break;if(map.containsKey(x)) { // 判断 x 是否已经存在 S 中map.remove(A[i]); // 若存在,则表示 A[i] 可以通过其它元素得到,估抛弃该元素break;}}}Set<Integer> set = map.keySet();for(Integer x : set) {int bit = 32 - Integer.numberOfLeadingZeros(x); // 获取 x 二进制位数的前导零个数if(bit > p) continue;ans += prefix[p - bit];ans %= MOD;}System.out.println(ans);}public static int nextInt() throws Exception {st.nextToken();return (int) st.nval;}
}
http://www.khdw.cn/news/70263.html

相关文章:

  • 查看网站用什么语言做的昆明seo案例
  • 一级a做爰片免播放器网站软件开发app制作公司
  • 免费注册qq号网站如何免费开自己的网站
  • 12数据网站建设专注于网站营销服务
  • 长沙做四维彩超玛丽亚m网站google网页版
  • 一台虚拟主机能建设几个网站搜索引擎优化的步骤
  • 介绍旅游美食的网站模板免费下载营销网络的建设
  • 小企业网站建设的连接方式公关公司排行榜
  • 服装网站建设目标网站seo收录
  • 网站系统建设招标免费搭建网站平台
  • 属于b2c网站的有哪几个seo关键词的选择步骤
  • 公司没有网站如何做外贸百度快速收录提交工具
  • 企业所得税税率是多少网站的排名优化怎么做
  • 网站鉴赏天津搜索引擎推广
  • 织梦模板怎么单独做移动端网站网络科技公司网站建设
  • 兴义市住房和城乡建设局网站广州网络公司
  • 长寿做网站手机百度seo快速排名
  • 网络营销的主要方式和技巧seo新人怎么发外链
  • 企业商务网站建设论文百度大搜推广
  • 郴州新网0735青岛seo博客
  • 程序员不是做网站的百度智能小程序怎么优化排名
  • 保定有那些网站免费永久注册顶级域名网站
  • wordpress添加产品图seo小白入门教学
  • 做网站客户拖着不验收软件开发工资一般多少
  • 怎么做可以把网站图片保存下来百度站长
  • sublime怎么做网站搜索引擎优化期末考试答案
  • 浏览器主页宁波正规优化seo公司
  • 淘宝客领券网站怎么做哪个网站学seo是免费的
  • 自助建网站平台怎么收费怎么安装百度
  • 婚庆网站开发计划书深圳外包seo