原文链接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的更多相关文章

  1. BZOJ CF388D. Fox and Perfect Sets [线性基 数位DP]

    CF388D. Fox and Perfect Sets 题意:求最大元素\(le n\)的线性空间的个数 给神题跪了 orz 容易想到 每个线性基对应唯一的线性空间,我们可以统计满足条件的对应空间不 ...

  2. 数位DP CF388D - Fox and Perfect Sets

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

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

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

  4. Codeforces 388 D. Fox and Perfect Sets

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

  5. Codeforces 1299D - Around the World(线性基+图论+dp)

    Codeforces 题目传送门 & 洛谷题目传送门 一道线性基的综合题 %%%%%% 首先注意到"非简单路径""异或和"等字眼,可以本能地想到线性基. ...

  6. bzoj 3811: 玛里苟斯【线性基+期望dp】

    这个输出可是有点恶心啊--WA*inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5 ...

  7. 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 ...

  8. Codeforces 388D Fox and Perfect Sets

    链接:CF388D 题目大意 给定一个数\(n\),求选择\(0 \sim n\)中任意个数的数字组成的集合\(S\)中,有多少满足若\(a\in S,b\in S\),则\(a \bigoplus ...

  9. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

随机推荐

  1. Unity shader学习之阴影,衰减统一处理

    使用unity AutoLight.cginc文件里的内置函数 UNITY_LIGHT_ATTENUATION shader如下: // Upgrade NOTE: replaced 'mul(UNI ...

  2. Rpgmakermv(7) Chronus插件介绍翻译

    协议:MIT 作用:时间,有时间推进,可以设置速度,随着游戏中时间的推进,会发生昼夜改变和天气变化. ------------------------------------------------- ...

  3. html5-样式的三种方式

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. weblogic 乱码

    1.找到weblogic安装目录,当前项目配置的domain 2.找到bin下的setDomainEnv.cmd文件 3.打开文件,从文件最后搜索第一个set JAVA_OPTIONS=%JAVA_O ...

  5. org/hibernate/ejb/HibernatePersistence

    java.lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence 缺少依赖包:hibernate-entitymanager ...

  6. js里用append()和appendChild有什么区别?

    parentNode.append()是还在试用期的方法,有兼容问题.是在parendNode节点中最后一个子节点后插入新Node或者DOMString(字符串,插入后为Text节点). 与paren ...

  7. 20165316 技能学习心得与c语言学习

    20165316 技能学习心得与c语言学习 一.技能学习经验 我会打乒乓球,在中国,我只能说我"会"打,至于"比大多数人更好"我不敢断言,因为我无时无刻不感受到 ...

  8. python requests库的简单使用

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似,但比urllib,urllib2更加使用简单. 1. requests库的安装在你的终端中运行pip安装命令即 ...

  9. ORM for Net主流框架汇总

    ORM框架:Object/Relation Mapping(对象/关系 映射)的缩写,易于理解的模型化数据的方法.简单的说就是把数据库的关系型数据类型转换为用对象型程序控制的框架类型. 框架优缺点分析 ...

  10. java加载配置文件信息

    #基金数据存放根目录fund_save_root_path=E:/fundCrawling #龙虎榜数据存放根目录long_hu_root_path=E:/longHuCrawling #巨潮数据存放 ...