原文链接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. caffe神经网络中不同的lr_policy间的区别

    lr_policy可以设置为下面这些值,相应的学习率的计算为: - fixed:  保持base_lr不变. - step:  如果设置为step,则还需要设置一个stepsize,  返回 base ...

  2. [IDE] ECLIPSE取消自动更新

    eclipse自动更新的取消方法: window --> preferences --> General --> Startup and Shutdown --> 在列表中找到 ...

  3. html5-常用的文本元素

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

  4. 【转】LoadRunner压力测试:测试报告结果分析

    见:https://blog.csdn.net/haoui123/article/details/62036723

  5. 线程&进程

    扯淡的yuan 并发&并行 并发:是指系统具有处理多个任务(动作)的能力. 并行:是指系统具有 同时 处理多个任务(动作)的能力. 同步&异步 同步:当进程执行到一个IO(等待外部数据 ...

  6. codeforces 984B Minesweeper

    题意: 给出一个矩阵,如果一个格子是数字,那么与这个格子相邻的格子中有炸弹的数量必须等于这个格子中的数字: 如果一个格子是空地,那么这个格子的所有相邻的格子中就不能有炸弹. 判断这个矩阵是否合法. 思 ...

  7. PersistenceContext.properties()

    在做 Spring + SpringMVC + SpringData 时,单元测试 报这个错误: java.lang.NoSuchMethodError:javax.persistence.Persi ...

  8. Linux基础命令---显示树形进程pstree

    pstree pstree显示正在运行的进程的树形结构,树以PID为根:如果省略了pid则以init为根.如果指定了用户名,则显示根植于该用户拥有的进程的所有进程树.如果pstree被调用为pstre ...

  9. <转>jmeter(十一)JDBC Request之Query Type

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  10. Java用Gson遍历json所有节点

    <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</ar ...