#P5267. 特工题解
【问题描述】
特工Star历经千辛万苦,潜入了敌国的信息中心。在那里,他盗取了一份含
有重要情报的文件。这份文件是一个整数序列{bi},其长度为N。根据已知的信
息,敌国的文件都由下列方式加密而成:
j
n j
i
a i j i b )2 mod )1 ) xor ) or (( ((bitcount
0
{ai}为加密前的序列,它和{bi}有着相同的长度;bitcount(x)含义为计算x二
进制位中1的个数。
现在,请你帮助Star快速破译出加密前的序列{ai}。
【输入】
第一行一个整数N;
第二行N个整数,依次分别表示bi。
【输出】
输出N个用空格隔开的整数,依次分别表示ai。
【输入输出样例】
spy.in spy.out
4
9 9 5 17
3 6 2 6
【数据范围】
对于30%的数据,N ≤ 300;
对于60%的数据,N ≤ 2500;
对于100%的数据,N ≤ 1500000,保证ai为不超过109的非负整数且N是2
的次幂。
思路
FWT即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,a[1500006],x,y,z;
void abc(long long *f,long long x){
for(int o=n;o>=2;o/=2){
for(int i=0;i<=n-1;i+=o){
x=f[i+o-1]-f[i+o/2-1];
for(int j=0;j<=o/2-1;j++){
y=f[i+j];
z=f[i+j+o/2];
f[i+j]=(y+z-x)/2;
f[i+j+o/2]=(x+z-y)/2;
}
}
}
return ;
}
int main(){
cin>>n;
for(int i=0;i<=n-1;i++){
scanf("%lld",&a[i]);
}
abc(a,1);
for(int i=0;i<=n-1;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}

浙公网安备 33010602011771号