#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; 	
}
posted @ 2026-02-06 17:20  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源