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. React Native Debug原理浅析

    第一次在segmentfault写博客,很紧张~~~公司项目上ReactNative,之前也是没有接触过,所以也是一边学习一边做项目了,最近腾出手来更新总结了一下RN的Debug的一个小知识点,不是说 ...

  2. 搭建Flutter开发环境需要注意的几个小Tips

    目录 下载SDK 安装 Android Stdio + SDK + tool SDK + 创建模拟器 + 插件(flutter和dart) Xcode + cocoapods VSCode + Flu ...

  3. vue cli web pack 全局引入jquery

    之前 装过,装 npm i —save  jquery  然后直接执行了第二步 往后 1,首先在 package.json 里加入, 然后 npm install 2, 在webpack.base.c ...

  4. 安卓 打飞机 app 开发 第一篇

    先上效果图 其实,当时刚买 htc G8 的时候(那时北京的房价还是6千一平),安卓2.1 ,2.3 的时候就已经有安卓方面的开发的兴趣,但后来就没有弄过... today 突然想起来,手机上连个游戏 ...

  5. go package 学习笔记 —— strconv(string与其他基本数据类型(int, float, bool)的转换)

    strconv实现了go中基本数据类型与string之间的转换. How to use in go go doc:https://godoc.org/strconv import "strc ...

  6. 去除 inline-block 元素间距

    案例重现 布局时经常能发现inline元素和inline-block元素水平呈现的元素间,会存在着一些意想不到的间距,举例: .inline-block { display: inline-block ...

  7. 学习RF遇到的问题

    1.Windows安装pip命令安装RF报错: File "<stdin>", line 1 pip install robotframework 原因:pip命令不在 ...

  8. Spark入门(四)--Spark的map、flatMap、mapToPair

    spark的RDD操作 在上一节Spark经典的单词统计中,了解了几个RDD操作,包括flatMap,map,reduceByKey,以及后面简化的方案,countByValue.那么这一节将介绍更多 ...

  9. Geotools在shapefile路网数据中建立缓冲区,并获取缓冲区内的要素

    记录一下如何创建创建缓冲区并获取缓冲区内的要素,便于以后查找使用 static SimpleFeatureSource featureSource = null; static CoordinateR ...

  10. ERP系统定价模型及费用组成

    很多人选择ERP系统的时候最关心的就是费用问题,因为很多中小企业资金都是比较缺乏的,如果需要使用大量的金钱来购买ERP系统这是不现实的.你知道ERP系统的定价模型有哪些吗?你知道影响ERP系统价格的因 ...