「CF1713F」 Lost Array 题解
「CF1713F」 Lost Array 题解
题意
有一个长为 的数组 ,把它作为方阵 的第零层,从第一层开始 ,直到第 层。现在已知每一层的最后一个位置,求构造 来还原它或说明无解。
。
题解
什么神仙题!!!!!1
先由 第?定律得知没有样例无解所以大概率没有无解的情况。
那就考虑用 怎么构造 。下面是一个非常妙的转化。
先考虑把 从右往左编号为 。先考虑 对 的贡献(矩阵的行也反过来编号,但列还是从上到下编号)那就是 ,由于是异或,所以我们只关心 的值。由于结论: 为奇数当且仅当 ,其中 指按位与,那么我们可以发现 其实就是 这里的异或超集和。结论的证明有心情再来补吧。
同理从 走到 (列上还是从上到下顺序编号)的方案数为 ,所以 是 的子集和。
那现在我们已经知道了 ,所以用逆子集和和逆超集和(在异或意义下也就是子集和和超集和)来还原 即可。
代码
查看代码
#include <bits/stdc++.h>
using namespace std;
template<typename T>void read(T &x)
{
T f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9') {x=x*10+s-'0';s=getchar();}
x*=f;
}
int arr[1000005];
int main() {
#ifndef ONLINE_JUDGE
freopen("input","r",stdin);
freopen("output","w",stdout);
#endif
int n;read(n);n--;
for(int i=0;i<=n;i++) read(arr[i]);
int Lg=log2(n);
for(int i=0;i<=Lg;i++) for(int j=n;j>=0;j--) if((j>>i)&1) arr[j]^=arr[j^(1<<i)];
for(int i=0;i<=Lg;i++) for(int j=0;j<=n;j++) if(!((j>>i)&1)) arr[j]^=arr[j^(1<<i)];
for(int i=n;i>=0;i--) printf("%d ",arr[i]);
return 0;
}
/*
清夜无尘。月色如银。酒斟时、须满十分。浮名浮利,虚苦劳神。叹隙中驹,石中火,梦中身。
虽抱文章,开口谁亲。且陶陶、乐尽天真。几时归去,作个闲人。对一张琴,一壶酒,一溪云。
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构