HDU Just do it (找规律暴力)

来源:互联网 发布:杀敌算法百度云 编辑:程序博客网 时间:2024/05/29 13:32

题目链接

Just do it

分析

简单打一下表,我们会发现,在第 m 次,第 x 项对第 y 项的贡献是 (yx+m1m1) 由于是异或所以只与这个组合数是否为奇数有关,由lucus定理 这个数是奇数 (yx+m1 and m1)=1
为 了方便后面的计算,我们简单的做一个变换,考虑什么时候 (yx) 对 y 有贡献,这样我们只需要将等式中的 x 换为 yx 这样可以消去 y 只不过这个复杂度的分析就不会了,当时始终感觉是 O(n2) 的,看了题解才知道原来题目的意思是,暴力上….

AC code

/*Problem : 6129 ( Just do it )     Judge Status : Accepted*RunId : 21750455    Language : G++    Author : zouzhitao*Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta*/#include<bits/stdc++.h>#define pb push_back#define mp make_pair#define PI acos(-1)#define fi first#define se second#define INF 0x3f3f3f3f#define INF64 0x3f3f3f3f3f3f3f3f#define random(a,b) ((a)+rand()%((b)-(a)+1))#define ms(x,v) memset((x),(v),sizeof(x))#define scint(x) scanf("%d",&x );#define scf(x) scanf("%lf",&x );#define eps 1e-10#define dcmp(x) (fabs(x) < eps? 0:((x) <0?-1:1))#define lc o<<1#define rc o<<1|1using namespace std;typedef long long LL;typedef long double DB;typedef pair<LL,LL> Pair;const int maxn = 2e5+10;int a[maxn];int b[maxn];int main(){    ios_base::sync_with_stdio(0);    cin.tie(0);    cout.tie(0);    int T;    cin>>T;    while (T--) {        int n,m;        cin>>n>>m;        ms(b,0);        m--;        for(int i=1 ; i<=n ; ++i )cin>>a[i];        memcpy(b,a,sizeof(a));        for(int i=1 ; i<=n ; ++i){            int x = i+m;            //std::cout << x<<" "<<m << '\n';            if((x & m) == m){                for(int j=i+1 ; j<=n ; ++j)b[j]^=a[j-i];            }        }        std::cout << b[1];        for(int i=2 ; i<=n ; ++i)            std::cout << ' '<<b[i];        std::cout  << '\n';    }    return 0;}