CF388D. Fox and Perfect Sets

题意:求最大元素\(le n\)的线性空间的个数


给神题跪了 orz


容易想到 每个线性基对应唯一的线性空间,我们可以统计满足条件的对应空间不同的线性基个数

每一位我们插入一个向量,就获得了这一位的控制权,否则这一位是自由的

因为要\(le n\),可以使用数位DP

从高位到低位考虑,设当前第i位,已经插入了j个向量

没有天际线的限制

  • 插入向量i的话,之前的向量位i必须是0,1种情况
  • 不插入向量i的话,之前的向量位i可以任选,\(2^j\)种情况

考虑天际线的限制

  • 不插入向量i,有\(2^{j-1}\)种情况可以继续顶着天际线
  • 如果a[i]==1,还有\(2^{j-1}\)种情况可以小于天际线
  • a[i]==1时可以插入向量i

然后我的转移方程写的好丑啊....然后鏼鏼鏼了一个简短的写法

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define fir first
#define sec second
const int N=40, P=1e9+7;
inline ll read() {
char c=getchar(); ll x=0, f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} int n, f[N][N][2], a[N], len;
ll mi[N];
inline void mod(int &x) {if(x>=P) x-=P;}
int dfs(int d, int j, int sky) { //printf("dfs %d %d %d\n",d,j,sky);
if(d==0) return 1;
if(f[d][j][sky] != -1) return f[d][j][sky];
int &now = f[d][j][sky], lim = sky ? a[d] : 1;
now=0;
if(!sky) {
mod(now += mi[j] * dfs(d-1, j, 0) %P );
mod(now += dfs(d-1, j+1, 0)%P );
} else {
mod(now += (j==0 ? 1 : mi[j-1]) * dfs(d-1, j, sky && 0==lim) %P);
if(a[d]==1) mod(now += dfs(d-1, j+1, sky && 1==lim)%P ),
mod(now += (j==0 ? 0 : mi[j-1]) * dfs(d-1, j, sky && 1==lim) %P );
}
//for(int i=0; i<=lim; i++) {
// mod(now += (j==0 ? !i : mi[j-1]) * dfs(d-1, j, sky && i==lim) %P);
// if(i==1) mod(now += dfs(d-1, j+1, sky && i==lim));
//} return now;
}
int main() {
freopen("in","r",stdin);
mi[0]=1;
for(int i=1; i<=30; i++) mi[i] = (mi[i-1]<<1)%P;
n=read();
while(n) a[++len]=n&1, n>>=1;
memset(f, -1, sizeof(f));
printf("%d", dfs(len, 0, 1));
}

BZOJ CF388D. Fox and Perfect Sets [线性基 数位DP]的更多相关文章

  1. 【做题】CF388D. Fox and Perfect Sets——线性基&数位dp

    原文链接https://www.cnblogs.com/cly-none/p/9711279.html 题意:求有多少个非空集合\(S \subset N\)满足,\(\forall a,b \in ...

  2. codeforces 388D Fox and Perfect Sets(线性基+数位dp)

    #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define mp mak ...

  3. 数位DP CF388D - Fox and Perfect Sets

    题目地址 一个整数perfect集合满足性质:集合中随意两个整数的异或和仍在这个集合中. 求最大数不超过K的perfect集合的个数. 每一个集合都是一个线性的向量空间. .能够通过全然的高斯消元得出 ...

  4. Codeforces 388 D. Fox and Perfect Sets

    $ >Codeforces \space 388 D.  Fox and Perfect Sets<$ 题目大意 : 定义一个完美的集合 \(S\) ,当且仅当 \(S\) 非负非空,且 ...

  5. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  6. BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基

    [题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...

  7. bzoj 4184 shallot——线段树分治+线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 本来想了可持久化trie,不过空间是 nlogn (出一个节点的时候把 tot 复原就 ...

  8. BZOJ.3105.[CQOI2013]新Nim游戏(线性基 贪心 博弈论)

    题目链接 如果后手想要胜利,那么在后手第一次取完石子后 可以使石子数异或和为0.那所有数异或和为0的线性基长啥样呢,不知道.. 往前想,后手可以取走某些石子使得剩下石子异或和为0,那不就是存在异或和为 ...

  9. BZOJ 2460: [BeiJing2011]元素 贪心,线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2460 解法:从大到小排序,依次贪心的添加到当前集合就可以了,需要动态维护线性基.用拟阵证明 ...

随机推荐

  1. c语言函数实参与形参整理

  2. 【Sql】mySQL在windows环境启动

    SQL的不同版本在Windows环境启动配置方法不同,此处仅介绍 5.7.20的配置方法: 1.登录mysql官网下载windows环境下的工具压缩包 http://dev.mysql.com/dow ...

  3. 01-01_环境准备_pyenv

    本文重点: 了解pyenv pyenv下载及安装 pyenv 使用 安装ipython 一.了解pyenv 经常遇到这样的情况: 系统自带的 Python 是 2.6,自己需要 Python 2.7 ...

  4. [国嵌攻略][045-046][一跃进入C大门]

    [一跃进入C大门] 跳转方式 1.相对跳转:b或bl指令,通过计算两个地址之间的差值来给pc赋值相对跳转 2.绝对跳转:ldr指令,通过给pc直接赋值,完成绝对跳转 代码编写 1.在汇编代码中直接使用 ...

  5. [UWP]使用Acrylic

    1. 前言 在 如何使用Fluent Design System 这篇文章里已经简单介绍过Reveal的用法,这篇再详细介绍其它内容. 自Windows 8 放弃Aero后,群众对毛玻璃回归的呼声一致 ...

  6. Ajax 跨域,这应该是最全的解决方案了

    https://segmentfault.com/a/1190000012469713 前言 从刚接触前端开发起,跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了 ...

  7. iOS开发中一些有用的小代码

    1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email {   NSString *emailRegex = @&q ...

  8. mybatis_helloword(1)

    摘录自:http://blog.csdn.net/y172158950/article/details/16979391 新的项目中用到mybatis,虽然不用自己写ORM的代码,但是借这个机会,学习 ...

  9. junit源码解析--捕获测试结果

    OK,前面的博客我们整理了junit运行完了所有的测试用例,那么OK了,现在开始该收集测试结果了. 在这最后一步中,junit主要是玩一个类,TestResult.这里类中封装了几个参数,在初始化这个 ...

  10. 02_HTML5+CSS详解第三天

    WebStorage简单的网页留言板用到的函数有3个1.saveStorage函数使用"new Date().getTime()"语句来获取当前的日期和时间戳,然后使用localS ...