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

给出d,m, 找到一个a数组,满足以下要求:

a数组的长度为n,n≥1;

1≤a1<a2<⋯<an≤d;

定义一个数组b:b1=a1, ∀i>1,bi=bi−1⊕ai ,并且 b1<b2<⋯<bn−1<bn ;

求满足条件的a数组的个数并模m;

人话:求一个a数组满足递增,并且异或前缀和也递增 ,求出a数组个数mod m。

太菜了,不会,看了很多题解才会的,这里总结一下:

参考官方题解 https://codeforces.com/blog/entry/75559

首先思考数组递增并且前缀异或和也递增(异或运算:不进位加法 1^1=0,1^0=1,0^0=0),那么就必须满足后面一个数二进制的最高位1的位置大于前面一个数的二进制的最高位1的位置,我们来看下为什么,假如最高位和前一个相同,那么前缀异或和最高位的1就消掉了,肯定会变小,最高位比前一个低,那这个数就比前一个数小了,不满足数组递增,所以要比前一个数的最高位高。

每个数1的最高位 h(ai)=v, v代表ai的最高位,例如:h(1)=0,h(2)=h(3)=1, and h(4)=h(7)=2。

找出每个最高位的个数,例如 h(ai)=v,ai的最高位为v,找到最高位为v的区间,[2v,2(v+1)−1] ,还要注意一个边界问题,不能大于d,所以为:[2v,min(2(v+1)−1,d)],那么个数就为 min(2(v+1)−1,d)-2v+1,最后再加上不选的一种情况,最后为min(2(v+1)−1,d)-2v+1+1。然后分组,把最高位相同的分在一起,每一次都从一个组里面选择一个数或者不选,来组成a数组,就是把每个最高位的个数都乘起来(不选的情况我把它算进最高位的个数里面了),再减掉全部不选的情况,就好了。

例如:d=6,最高位为0的有1个,那么我们有两种选择,选1或者不选;最高位为1的有2个,那么我们有三种选择,选2或者3或者不选,最高位为2的有3个,那么我们有四种选择,选4或者5或者6或者不选;然后组合在一起,里面有全部不选的一种情况,所以最后结果要减1,即:2*3*4-1=23.

写得很啰嗦,因为我看了好久才看懂 ~~

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+;
const int mod=1e9+;
typedef long long ll;
//typedef __int128 LL;
const int inf=0x3f3f3f3f;
const long long INF=0x3f3f3f3f3f3f3f3f; int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll d,m;
scanf("%lld%lld",&d,&m);
ll ans=;
for(int i=;i<=;i++)
{
if(d<(<<i))break;
ans=(ans*(min(d,(1ll<<(i+))-)-(<<i)++))%m;
}
ans--;
if(ans<)ans+=m;
printf("%lld\n",ans);
}
return ;
}

还有一种递推的方法,参考博客:https://www.cnblogs.com/AaronChang/p/12635428.html

用一个cnt[i]数组来记录每个最高位的个数,每次选择了一个数之后就从后面的数中选择;

dp[i]表示二进制的最高位1在前i位(包含第i位)的方案数之和,dp[i]=dp[i-1]+dp[i-1]*cnt[i]+cnt[i] ,(只单独取cnt[i]也可以)

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+;
const int mod=1e9+;
typedef long long ll;
//typedef __int128 LL;
const int inf=0x3f3f3f3f;
const long long INF=0x3f3f3f3f3f3f3f3f;
ll dp[],cnt[];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll d,m;
scanf("%lld%lld",&d,&m);
ll a=d,idx=,t=;
while(a)
{
cnt[++idx]=min(d-(t-),t);//下标从1开始,方便dp数组
t<<=;
a>>=;
}
for(int i=;i<=idx;i++)dp[i]=((dp[i-]+(dp[i-]*cnt[i])%m)%m+cnt[i])%m;
printf("%lld\n",dp[idx]);
}
return ;
}

Codeforces 631 (Div. 2) D. Dreamoon Likes Sequences 位运算^ 组合数 递推的更多相关文章

  1. Codeforces Round #631 (Div. 2) D.Dreamoon Likes Sequences

    题目连接:Dreamoon Likes Sequences  题意:给你d和m,让你构造一个递增数组a,使数组b(i==1,b[i]=a[i] ; i>1, b[i]=b[i-1]^a[i])递 ...

  2. Codeforces Round #631 (Div. 2) D. Dreamoon Likes Sequences (bitmasks +dp )

    https://codeforces.com/contest/1330/problem/D 题目大意:给出一个限制 d 与模数 m ,求出可以构造出的满足条件的数组 a 的个数,需要满足以下条件:   ...

  3. Codeforces Round #631 (Div. 1) B. Dreamoon Likes Sequences 题解(思维+求贡献)

    题目链接 题目大意 让你构造一个严格单调上升的数组a满足\(1<=a_1<a_2<....a_n<=d\) 而且要使得这个数组的异或前缀和也满足严格单调上升,求有多少个满足条件 ...

  4. Codeforces 631 (Div. 2) C. Dreamoon Likes Coloring 思维or构造

    https://codeforces.com/contest/1330/problem/C 给n个格子染色,有m种颜色,要求最后的所以格子被染色,并且有m种颜色. 染色要求:每种颜色有一个值li,选择 ...

  5. Codeforces 631 (Div. 2) E. Drazil Likes Heap 贪心

    https://codeforces.com/contest/1330/problem/E 有一个高度为h的大顶堆:有2h -1个不同的正整数,下标从1到2h−1,1<i<2h, a[i] ...

  6. CF 1329B Dreamoon Likes Sequences

    传送门 题目: Dreamoon likes sequences very much. So he created a problem about the sequence that you can' ...

  7. Vus the Cossack and Strings(Codeforces Round #571 (Div. 2))(大佬的位运算实在是太强了!)

    C. Vus the Cossack and Strings Vus the Cossack has two binary strings, that is, strings that consist ...

  8. Codeforces Round #672 (Div. 2 B. Rock and Lever (位运算)

    题意:给你一组数,求有多少对\((i,j)\),使得\(a_{i}\)&\(a_{j}\ge a_{i}\ xor\ a_{j}\). 题解:对于任意两个数的二进制来说,他们的最高位要么相同要 ...

  9. Codeforces 620E New Year Tree(线段树+位运算)

    题目链接 New Year Tree 考虑到$ck <= 60$,那么用位运算统计颜色种数 对于每个点,重新标号并算出他对应的进和出的时间,然后区间更新+查询. 用线段树来维护. #includ ...

随机推荐

  1. 一起了解 .Net Foundation 项目 No.18

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Protobuild Pr ...

  2. SpringBoot+AOP构建多数据源的切换实践

    针对微服务架构中常用的设计模块,通常我们都会需要使用到druid作为我们的数据连接池,当架构发生扩展的时候 ,通常面对的数据存储服务器也会渐渐增加,从原本的单库架构逐渐扩展为复杂的多库架构. 当在业务 ...

  3. 028.核心组件-API Server

    一 Kubernetes API Server原理 1.1 API Server功能 Kubernetes API Server的核心功能是提供Kubernetes各类资源对象(如Pod.RC.Ser ...

  4. (转)协议森林04 地址耗尽危机 (IPv4与IPv6地址)

    协议森林04 地址耗尽危机 (IPv4与IPv6地址) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! IP地址是IP协议的重要组 ...

  5. seldom之数据驱动

    seldom之数据驱动 如果自动化某个功能,测试数据不一样而操作步骤是一样的,那么就可以使用参数化来节省测试代码. seldom是我在维护一个Web UI自动化测试框,这里跟大家分享seldom参数化 ...

  6. 【问题记录】记一次ConnectionTimeout问题排查

    最近做性能测试时,发现连接第三方系统时会有约1%的交易提示如下错误 nested exception is org.apache.commons.httpclient.ConnectTimeoutEx ...

  7. thinkphp 前后端分离

    thinkphp 前后端分离 简单记录一下之前学习tp的历程吧. 前端HTML页面渲染 <?php namespace app\index\controller; use think\Contr ...

  8. python使用argparse 、paramiko实现服务器管理器

    使用argparse,paramiko两个包去实现简易的服务器管理器,完成两种方式的连接( 密码和密钥 ),以及命令行交互,文件上传下载. 相比sys.argv的方式去判断传入的参数,如果参数较多那么 ...

  9. WEB应用之httpd基础入门(四)

    前文我们聊到了httpd的虚拟主机实现,状态页的实现,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12570900.html:今天我们来聊一聊后面的常用基础配 ...

  10. Django HttpResponse笔记

    HttpResponse 概述:给浏览器返回数据 HttpRequest对象是由django创建的,HttpResponse对象由程序员创建 用法 1:不调用模板,直接返回数据. 例: def get ...