「CF1713F」Lost Array

「CF1713F」Lost Array

Link

Solution

考虑将前缀贡献转换为路径计数,为方便,将列编号从右向左依次编号为 0n。考虑 (0,i)(j,0) 的贡献次数其实是 (i+ji),因为是异或,那么可以考虑 (i+ji)mod2,根据 Lucas 定理这其实是 [ii+j].

bi=i and (i+j)=iaj

n=2k 时可以用 IFWT 直接做。
我们发现 (0,0),(1,1),,(n,n) 这些对角线上的元素可以简化我们的式子,具体的

ai,i=ija0,jai,0=jiaj,j

所以我们可以通过对 a 做一次超集和再做一次子集和得到 b,同理通过对 b 做一次逆子集和再做一次逆超集和得到 a,因为在异或下,集合容斥的 (1)k 系数可以忽略,那么此时超集和等价与逆超集和,子集和等价与逆子集和,所以直接对 b 做一次子集和再做一次超集和可以得到 a.

Code

点击查看代码
#include<bits/stdc++.h>
#define MAXN (1000005)
#define MAXT (22)
#define MAXS (1124292)
#define ll long long
using namespace std;
void File()
{
    freopen("/home/noi/A/IO/in.txt","r",stdin);
    freopen("/home/noi/A/IO/out.txt","w",stdout);
}
template<typename type>
void read(type &x)
{
	x=0;char ch=0;bool ff=0;
	while(ch<'0'||ch>'9'){ff|=!(ch^'-');ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	x=ff?-x:x;
}
int n,LG;
int a[MAXN];
int main()
{
    File();
    read(n);
    --n;
    LG=__lg(n);
    for(int i=0;i<=n;i++)
        read(a[i]);
    for(int i=0;i<=LG;i++)
        for(int S=n;S>=0;S--)
            if((S>>i)&1)
                a[S]^=a[S^(1<<i)];
    for(int i=0;i<=LG;i++)
        for(int S=0;S<=n;S++)
            if(((S>>i)&1)^1)
                a[S]^=a[S^(1<<i)];
    for(int i=n;i>=0;i--)
        printf("%d ",a[i]);
}

作者:littlepinkpig

出处:https://www.cnblogs.com/littlepinkpig/p/17718218.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

你可以在这里自定义其他内容

作者:littlepinkpig

出处:https://www.cnblogs.com/littlepinkpig/p/17718218.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   little_pinkpig  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
more_horiz
keyboard_arrow_up light_mode palette
选择主题