【5.7 基础班笔记】

1

lucas定理
p进制,每一位 ni n i 必须大于等于 mi m i
f[i]表示以a[i]结尾的序列的个数。
枚举j 若 a[i]&a[j]==a[j] a [ i ] & a m p ; a [ j ] == a [ j ] ,则 f[i]+=f[j] f [ i ] + = f [ j ]

直接枚举 a[i] a [ i ] 的子集 318 3 18

发现加的复杂度高,赋值的复杂度低,考虑平衡一下。
枚举子集: (s1)&a[i] ( s − 1 ) & a m p ; a [ i ]
超集: (s+j)|a[i] ( s + j ) | a [ i ]
分成两部分,f[i][j]表示右边9位是j,左边9位是i集合超集的 f[(i<<9)+j] f [ ( i << 9 ) + j ] 的和。
现在更新要更新 29 2 9 ,求和需要 29 2 9 .

2

小星星
一一对应,使得树上有边图上也有边
在树上做 dp d p
f[i][j] f [ i ] [ j ] 表示i对应图中j,i的子树有多少种标号方法
g[i][j] g [ i ] [ j ] 表示原图中i,j是否联通

for(int i=head[u];i;i=ed[i].next)
{
    int v=ed[i].to;
    if(v==fa) continue;
    dfs(v,u);
    for(int j=0;j<n;j++)
    {
        long long s=0;
        for(int k=0;k<n;k++)
        {
            if(g[j][k]) s+=f[v][k];
        }
        f[u][j]*=s;
    }
}

这个dp我们强制允许图上的一个点对应树上的多个点(不允许没法做…)
然后进行一波容斥。

枚举一个子集,然后只用这个集合里的点做一次dp
然后根据这个集合与全集的大小之差判断符号。
如果差了奇数,减去,否则加上
这样除了全集以外每个集合正负恰好抵消。
比如:1100
在1111时被计算一次
在计算1101 1110时减去两次
在计算1100的时候被加上一次
最后不被统计进答案里。

原来n=17是给容斥的…

3

按位或
min-max容斥

max(a,b,c)=a+b+cmin(a,b)min(b,c)min(a,c)+min(a,b,c) m a x ( a , b , c ) = a + b + c − m i n ( a , b ) − m i n ( b , c ) − m i n ( a , c ) + m i n ( a , b , c )

比较好求期望

设第i位成为1的时间是 ti t i
E[max(t1,t2,t3)]= E [ m a x ( t 1 , t 2 , t 3 ) ] = … …
min比较好处理,要么染到,要么没染到。
考虑没有染到的概率。
染到的概率是 p p ,那么期望时间是1/p
染到的概率不好求,转化为求没染到的概率。
对于每个集合,求所有子集的概率和
输入 pi p i
对于每个j,求所有满足 (j&amp;i)==i ( j & a m p ; i ) == i pi p i 之和,设为 sj s j
处理前缀和:

for(int j=0;j<n;j++)
{
    for(int i=0;i<(1<<n);i++)
    {
        if((i>>j)&1) s[i]+=s[i^(1<<j)]
    }
}

4

cdq c d q 分治

void work(int l,int r)
{
    if(l==r) return;
    int mid=(l+r)>>1;
    work(l,mid);
    solve()            //处理左边对右边的影响
    work(mid+1,r);
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值