「CF1713F」Lost Array
考虑将前缀贡献转换为路径计数,为方便,将列编号从右向左依次编号为 。考虑 到 的贡献次数其实是 ,因为是异或,那么可以考虑 ,根据 定理这其实是 .
在 时可以用 直接做。
我们发现 这些对角线上的元素可以简化我们的式子,具体的
所以我们可以通过对 做一次超集和再做一次子集和得到 ,同理通过对 做一次逆子集和再做一次逆超集和得到 ,因为在异或下,集合容斥的 系数可以忽略,那么此时超集和等价与逆超集和,子集和等价与逆子集和,所以直接对 做一次子集和再做一次超集和可以得到 .
点击查看代码
#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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通