【做题】CF388D. Fox and Perfect Sets——线性基&数位dp
原文链接https://www.cnblogs.com/cly-none/p/9711279.html
题意:求有多少个非空集合\(S \subset N\)满足,\(\forall a,b \in S, a \bigotimes b \in S\),且\(S\)中的最大元素不超过\(n\)。对\(10^9 + 7\)取模。
\(n \leq 10^9\)
显然,每个合法的集合\(S\)都可以由一个线性基来生成。然而,一个集合可以有多个线性基。如果我们能让每个合法集合和每个符合某条件的线性基一一对应,那么我们就能把问题转化为对某类线性基的计数。
考虑对线性基进行高斯消元。结果就是,在线性基中的每一位,要么是一个基的最高位,那么其他的基上的这一位都是0;否则所有基上这一位可以任意填。因为它们可以由任何线性基高斯消元得到,所以每一个合法集合都能有这样的一个线性基。同样,每一个线性基可以生成一个合法的集合。剩下的问题就在于,证明所有不同的高斯消元后的线性基,生成的集合是不同的。
- 两个线性基的基数不同或基的最高位不同。那么它们生成的集合显然不同。
- 基数和每个基的最高位都相同。考虑两个线性基中最大的不相同的基。我们取出其中的一个基,尝试在另一个线性基中表达这个数。但当我们遇到它们不相同的最高一位时,因为这一位可以是1或0,所以没有一个基的最高一位是这一位,所以那个基不能被另一个线性基表达。那么,这两个线性基生成的集合就是不同的。
接下来,我们对线性基做dp就可以了。容易得到,高斯消元后的线性基,能表达出的最大元素就是所有基的异或和。那么,我们从高到低在每一位上讨论,是否存在一个基的最高位是这一位以及这一位上所有基的异或和就好了。当然要再套一个数位dp。
时间复杂度\(O(\log^2 n)\)。
#include <bits/stdc++.h>
using namespace std;
const int N = 40, MOD = (int)(1e9 + 7);
int dp[N][N][2],len,lim[N],n,ans;
int calc(int x,int sgn) {
if (x == 0) return sgn ^ 1;
return 1 << x >> 1;
}
int main() {
cin >> n;
if (n == 0) return puts("1"), 0;
while (n) {
lim[++len] = n&1;
n >>= 1;
}
reverse(lim+1,lim+len+1);
dp[0][0][1] = 1;
for (int i = 0 ; i < len ; ++ i)
for (int j = 0 ; j <= i ; ++ j)
for (int k = 0 ; k < 2 ; ++ k) {
(dp[i+1][j][k & (lim[i+1]^1)] += 1ll * dp[i][j][k] * calc(j,0) % MOD) %= MOD;
if ((!k) || lim[i+1]) {
(dp[i+1][j][k] += 1ll * dp[i][j][k] * calc(j,1) % MOD) %= MOD;
(dp[i+1][j+1][k] += dp[i][j][k]) %= MOD;
}
}
for (int i = 0 ; i <= len ; ++ i)
(ans += (dp[len][i][0] + dp[len][i][1]) % MOD) %= MOD;
printf("%d\n",ans);
return 0;
}
小结:关键也就在于线性基可以通过高斯消元避免重复。算是涨知识了。
【做题】CF388D. Fox and Perfect Sets——线性基&数位dp的更多相关文章
- BZOJ CF388D. Fox and Perfect Sets [线性基 数位DP]
CF388D. Fox and Perfect Sets 题意:求最大元素\(le n\)的线性空间的个数 给神题跪了 orz 容易想到 每个线性基对应唯一的线性空间,我们可以统计满足条件的对应空间不 ...
- 数位DP CF388D - Fox and Perfect Sets
题目地址 一个整数perfect集合满足性质:集合中随意两个整数的异或和仍在这个集合中. 求最大数不超过K的perfect集合的个数. 每一个集合都是一个线性的向量空间. .能够通过全然的高斯消元得出 ...
- 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\) 非负非空,且 ...
- Codeforces 1299D - Around the World(线性基+图论+dp)
Codeforces 题目传送门 & 洛谷题目传送门 一道线性基的综合题 %%%%%% 首先注意到"非简单路径""异或和"等字眼,可以本能地想到线性基. ...
- bzoj 3811: 玛里苟斯【线性基+期望dp】
这个输出可是有点恶心啊--WA*inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5 ...
- Codeforces Round #460 (Div. 2) B Perfect Number(二分+数位dp)
题目传送门 B. Perfect Number time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces 388D Fox and Perfect Sets
链接:CF388D 题目大意 给定一个数\(n\),求选择\(0 \sim n\)中任意个数的数字组成的集合\(S\)中,有多少满足若\(a\in S,b\in S\),则\(a \bigoplus ...
- HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...
随机推荐
- 前端流程图jsplumb学习笔记
1.这篇博客很好,另外两个是官网文档 http://www.cnblogs.com/leomYili/p/6346526.html https://jsplumbtoolkit.com/communi ...
- Maven的作用、用途、内涵、愿景
maven被许多人认为是一个构建工具.许多人最初是从熟悉ant而转到maven的,因此很自然地这样认为maven是一个构建工具.但是maven并不仅仅是一个构建工具,也不是ant的一个替代工具.mav ...
- Helter Skelter (扫描线 + 离散化 + 树状数组)
扫描线:按照其中一个区间的标记为pos,然后左区间标记d为正影响,有区间标记d为负影响,然后根据所有的pos排序.pos从小扫到大,那么对于某一个区间一定会被扫过2次,那么经过2次之后就只剩下中间那一 ...
- turtle库基础练习
1.画一组同切圆 import turtle turtle.circle(10) turtle.circle(20) turtle.circle(30) turtle.circle(40) turtl ...
- python 将一个JSON 字典转换为一个Python 对象
将一个JSON 字典转换为一个Python 对象例子 >>> s='{"name":"apple","shares":50 ...
- superblock 区块数据读取
鸟哥私房菜笔记: 命令:df -Th Filesystem:代表该文件系统是在哪个 partition ,所以列出设备名称:1k-blocks:说明下面的数字单位是 1KB 呦!可利用 -h 或 -m ...
- linux常用命令:mkdir 命令
linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项] 目录... 2.命令 ...
- 移动端点击返回时强制页面刷新解决办法(pageshow)
在做移动端项目的时候经常遇到这样一个功能比如: 返回后页面不刷新,一些失效的信息依然显示在页面上.这个问题在iphone手机上会出现,在Android手机上返回时会自动刷新(由于手机机器种类不多,无法 ...
- multiple definition of XXX情况分析
近日在写代码,各个.cpp源文件编译时没有问题,将*.o进行链接时,出现了许多multiple definition of XXX的链接错误.于是在网上搜索了一番,结合自己的代码包含逻辑,最终发现了问 ...
- flask框架----flask-session组件
简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数 ...