Codeforces 388D Fox and Perfect Sets
链接:CF388D
题目大意
给定一个数\(n\),求选择\(0 \sim n\)中任意个数的数字组成的集合\(S\)中,有多少满足若\(a\in S,b\in S\),则\(a \bigoplus b \in S\),输出方案数对\(1e9+7\)取模。
题目分析
设\(f[i][j][k]\)表示从第\(i\)位到最高位,已经选了\(j\)个基,且由基\(\bigoplus\)得到的最大值与\(n\)的差值是否在\(2^i\)以内的方案数。
况一:当\(k=0\)(异或最大值\(+2^i<n\))时,考虑第\(i-1\)位。
如果该位要作为单独一个基,那么有\(f[i-1][j+1][0]+=f[i][j][0]\),
该位单独作基,则新增情况数为之前有的情况,视为在之前每种情况上\(x\)新增一个\(2^{i-1} \)的基,
由设可保证新构成的集合异或最大值与\(n\)的差值在\(2^{i-1}\)之外,所以算在\(f[i-1][j+1][0]\)中。
如果该位不单独作基,而是放入已经拥有的j个基中,
那么对于每个基,都有放与不放两种选择,共\(2^j\)种,\(f[i-1][j][0]+=2^j*f[i][j][0]\)。
况二:当\(k=1\)(异或最大值\(+2^i>=n\))时,考虑第\(i-1\)位。
讨论\(n\)在第\(i-1\)位是否为\(1\):
1、\(n\)在第\(i-1\)位不为\(1\),异或最大值\(+2^{i-1}>n\):
此时最大值无法新增一个\(2^{i-1}\)。
那么,我们只能继承令第\(i-1\)位为偶数个\(1\)的情况,因为只有这样,最大值才不会改变,共\(2^{j-1}\)种。
2、\(n\)在第\(i-1\)位为\(1\),异或最大值\(+2^{i-1}≤n\):
如果在第\(i-1\)位取\(0\),那么新得到的集合异或最大值\(+2^{i-1}≤n\),因此应存入\(f[i-1][j][0]\)中,共\(2^{j-1}\)种。
如果在第\(i-1\)位取\(1\),那么新得到的集合异或最大值\(+2^{i-1}≥n\),因此应存入\(f[i-1][?][1]\)中。
对于第\(i-1\)位单独作基的情况,可以有\(f[i][j][1]\)种,存入\(f[i-1][j+1][1]\)中,\(f[i-1][j+1][1]+=f[i][j][1]\)。
对于第\(i-1\)位不单独作基的情况,可以对每个基选择放与不放,且必须放奇数个,共\(2^{j-1}\)种选择,
因此\(f[i-1][j][1]+=2^{j-1}*f[i][j][1]\)。
注意:
对于所有情况,当\(j=0\),对于选择第\(i-1\)位为\(0\)的情况,\(2^{j-1}\)算作\(1\);
对于选择第\(i-1\)位为\(1\)的情况,\(2^{j-1}\)算作\(0\),因为就算你没有选择一个基,你的异或和仍可以视作\(0\)。
代码实现
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#define MAXN 0x7fffffff
typedef long long LL;
const int mod=1e9+7;
using namespace std;
inline int Getint(){
register int x=0,f=1;
register char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int ans,f[35][35][2];
void Add(int &x,int y){x=((x+y>=mod)?(x+y-mod):(x+y));}
int main(){
int n=Getint();
f[30][0][1]=1;
for(int i=30;i>0;i--)
for(int j=0;j<=30;j++){
Add(f[i-1][j][0],(1LL<<j)*f[i][j][0]%mod);
Add(f[i-1][j+1][0],f[i][j][0]);
int x=j?(1<<(j-1)):1,y=j?(1<<(j-1)):0;
if(n>>(i-1)&1){
Add(f[i-1][j][0],(LL)x*f[i][j][1]%mod);
Add(f[i-1][j][1],(LL)y*f[i][j][1]%mod);
Add(f[i-1][j+1][1],f[i][j][1]);
}else Add(f[i-1][j][1],(LL)x*f[i][j][1]%mod);
}
for(int i=0;i<=30;i++)
Add(ans,f[0][i][0]),Add(ans,f[0][i][1]);
cout<<ans;
return 0;
}
Codeforces 388D Fox and Perfect Sets的更多相关文章
- codeforces 388D Fox and Perfect Sets(线性基+数位dp)
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define mp mak ...
- Codeforces 388 D. Fox and Perfect Sets
$ >Codeforces \space 388 D. Fox and Perfect Sets<$ 题目大意 : 定义一个完美的集合 \(S\) ,当且仅当 \(S\) 非负非空,且 ...
- BZOJ CF388D. Fox and Perfect Sets [线性基 数位DP]
CF388D. Fox and Perfect Sets 题意:求最大元素\(le n\)的线性空间的个数 给神题跪了 orz 容易想到 每个线性基对应唯一的线性空间,我们可以统计满足条件的对应空间不 ...
- 数位DP CF388D - Fox and Perfect Sets
题目地址 一个整数perfect集合满足性质:集合中随意两个整数的异或和仍在这个集合中. 求最大数不超过K的perfect集合的个数. 每一个集合都是一个线性的向量空间. .能够通过全然的高斯消元得出 ...
- 【做题】CF388D. Fox and Perfect Sets——线性基&数位dp
原文链接https://www.cnblogs.com/cly-none/p/9711279.html 题意:求有多少个非空集合\(S \subset N\)满足,\(\forall a,b \in ...
- CodeForces 388A Fox and Box Accumulation (模拟)
A. Fox and Box Accumulation time limit per test:1 second memory limit per test:256 megabytes Fox Cie ...
- Codeforces 388C Fox and Card Game (贪心博弈)
Codeforces Round #228 (Div. 1) 题目链接:C. Fox and Card Game Fox Ciel is playing a card game with her fr ...
- codeforces 510B. Fox And Two Dots 解题报告
题目链接:http://codeforces.com/problemset/problem/510/B 题目意思:给出 n 行 m 列只有大写字母组成的字符串.问具有相同字母的能否组成一个环. 很容易 ...
- codeforces 477B B. Dreamoon and Sets(构造)
题目链接: B. Dreamoon and Sets time limit per test 1 second memory limit per test 256 megabytes input st ...
随机推荐
- spring注解方式配置以及spring4的泛型注入 (4)
目录 一.@Controller 注解控制层(action) 二.@Service 注解服务层 三.@Repository 持久层 四.spring4的泛型注入测试 1 创建两个实体User和Role ...
- Mybatis笔记 – Po映射类型
一.输入映射类型 parameterType定义输入到sql中的映射类型,可以是 简单类型 .po类对象(可自动生成 或 手动定义). pojo包装对象(用于综合查询,UserCustom用户自定 ...
- 剑指offer——34之字打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题解: 与上道题没区别,就是在存入数据时 ...
- XStream入门应用程序
在进入XStream库的细节之前,让我们来看看应用程序操作.在这个例子中,我们创建Student和Address类.还将创建一个Student对象,然后将其序列化到一个XML字符串.然后反序列化的同一 ...
- oracle 管理表空间
表空间:是oracle数据库中最大的逻辑存储结构,与操作系统中的数据文件相对应,用于存储数据库中用户创建的所有内容 表空间>数据文件 4.1创建一个永久性表空间myspace create ta ...
- axios全局拦截响应
在系统开发过程中,若遇到长时间未操作,则需要将页面跳转到登录页面.因为现在都是前后端分离的开发模式,路由跳转都交给前端,而后端只返回一个报错信息,例如"errorMsg":&quo ...
- Git仓库操作命令
创建仓库 git init 在当前目录执行,会生成.git目录文件,这个和SVN一致. 提交到仓库 git commit -m "first commit" -m:表示提交描述,必 ...
- tcp_tw_recycle和tcp_timestamps的一些知识(转)
现在很多公司都用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,这其实就是NAT,当请求到达LVS后,它修改地址数据后便转发给后端服务器,但不会修改时间戳数据,对于后端服务器来说,请求的源 ...
- ASP.NET加断点调试,却跳不进方法的原因。
1.首先调试后看一下断点是不是空心的,如果是,鼠标放在断点上,按提示操作即可. 提示如图所示:
- rem换算公式
当前rem基准值=预设的基准值/设计稿宽度*当前设备的宽度