首页 > 其他分享 >[数学记录][sosdp]CF449D Jzzhu and Numbers

[数学记录][sosdp]CF449D Jzzhu and Numbers

时间:2022-11-24 20:49:01浏览次数:66  
标签:int Jzzhu sosdp Numbers FWT CF449D dp mod

前几天做 arc 时连做两道高维前缀和,今天去看 dp 题单时发现这东西居然叫 sos dp,来刷一下板子。

粘一篇 找到的 blog,感觉引入那里非常自然!

link to CF | link to Luogu

给定一个长度为 \(n\) 的序列,求选出一个子序列,这些数按位与为 \(0\) 的方案数。

\(n,a_i \leq 2^{20}\)

首先显然正着不好做。数字太多了,按位与的信息量也很大,明显不可能存下来,因此要反着做。可以考虑的是反演或容斥。

现在尝试钦定一些位为 \(1\)。则根据容斥原理能写出 \(ans = \sum 2^{f(S)} \cdot (-1)^{|S|}\),其中 \(f(S)\) 代表钦定集合 \(S\) 中的位为 \(1\) 时的方案数。

接下来只用统计 \(S \in i\) 的 \(i\),取完补集后 \(\~i \in \~S\),这是高维前缀和板子,直接 FWT 上去即可。

这才 *2400 吗?可能是我初学 FWT 罢。

#include <cstdio>
using namespace std;
const int M = 21, mod = 1000000007;
int sum[1 << M], a[1 << M], n, pw[1 << M];
void addn(int &x, int y) {if((x += y) >= mod) x -= mod;}
int main(){
    scanf("%d", &n); int all = (1 << 20) - 1;
    pw[0] = 1;
    for(int i = 1; i <= n; i++) pw[i] = 1ll * pw[i-1] * 2 % mod;
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]), ++sum[all ^ a[i]];
    for(int i = 0; i < 20; i++) 
        for(int j = 0; j < 1 << 20; j++)
            if(j & (1 << i)) sum[j] += sum[j ^ (1 << i)];
    int ans = 0;
    for(int i = 0; i < 1 << 20; i++) {
        addn(ans, (__builtin_popcount(all ^ i) & 1) ? (mod - pw[sum[i]]) : pw[sum[i]]);
    }
    printf("%d\n", ans);
    
}

标签:int,Jzzhu,sosdp,Numbers,FWT,CF449D,dp,mod
From: https://www.cnblogs.com/purplevine/p/16923170.html

相关文章

  • [LeetCode] 2133. Check if Every Row and Column Contains All Numbers
    An nxn matrixis valid ifeveryrowandeverycolumncontains all theintegersfrom 1 to n (inclusive).Givenan nxn integermatrix matrix,re......
  • UESTC 1272 Final Pan's prime numbers
    DescriptionFinalPanlikesprimenumbersverymuch.Oneday,hewanttofindthesuperprimenumbers.Aprimenumbers n(n>4)isasuperprimenumberonlyif ......
  • HUST 1600 Lucky Numbers
    DescriptionIsun lovesdigit4and8verymuch.Hethinksanumberisluckyonlyifthenumbersatisfythefollowingconditions: 1.      The......
  • k-Amazing Numbers
    题目:Youaregivenanarrayaconsistingofnintegersnumberedfrom1ton.Let’sdefinethek-amazingnumberofthearrayastheminimumnumberthatoccursin......
  • [??记录]arc137C Distinct Numbers
    这段时间第一道没能自己想出来的题。题意:给定\(n\)个数,二人玩游戏,每次把全局最大数减小并改成一个当前未出现的数,不能操作者败。求胜者。首先我们来研究一次操作时的情......
  • CodeForces - 914C Travelling Salesman and Special Numbers
    题意:给出一个二进制数a,每次操作将当前数变成其二进制下1的个数,若干次操作后可以将其变为1.给定k,求不大于a的数中,经过k次操作能变成1的数的数量。解:观察一下这个操作,可以求......
  • 【POJ1430】Binary Stirling Numbers(第二类斯特林数,组合数)
    求\(\begin{Bmatrix}n\\m\end{Bmatrix}\bmod2\)的值。由第二类斯特林数的递推公式:\[\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\begi......
  • 8.CF446C DZY Loves Fibonacci Numbers 线段树Lazy标记
    8.CF446CDZYLovesFibonacciNumbers线段树Lazy标记给定序列,要求支持区间对应项加斐波那契数列,区间求和洛谷传送门:​​CF446CDZYLovesFibonacciNumbers-洛谷|计......
  • Codeforces Round #673 (Div. 2) C. k-Amazing Numbers
    题面Youaregivenanarrayaconsistingofnintegersnumberedfrom1ton.Let’sdefinethek-amazingnumberofthearrayastheminimumnumberthatoccurs......
  • How many prime numbers
    题目链接Howmanyprimenumbers大素数的判定解题思路miller_rabinmiller_rabin是一种概率性素数测试,原理基于费马素数测试,即如果\(n\)为素数,则在\(1\simn\)......