HDU多校2017第7场

Posted dowhile0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU多校2017第7场相关的知识,希望对你有一定的参考价值。

6121 Build a tree

6125 Free from square

6126 Give out candies

6127 Hard challenge

6128 Inverse of sum

6129 Just do it

对于变换$m$次之后的序列,考虑$a_0$对$a_i(0 le i < n)$的贡献,为$C_{m-1+i}^i$个$a_0$相异或的结果。同样地,$a_1$对$a_{i+1}(0 le i<n-1)$的贡献也为$C_{m-1+i}^i$。然后,组合数判定奇偶性:杨辉三角第$i$行第$j$列的元素为$C_i^j$,如果$(i & j) == j$,则$C_i^j$为奇数,否则为偶数。接下来,只需要枚举$a_0$对$a_i(0 le i < n)$的贡献,若为奇数,则$a_1$对$a_{i+1}$的贡献,$a_2$对$a_{i+2}$的贡献,$dots$,只需要暴力做相同的处理即可。放心,不会超时的。我随机造了几十组数据规模$2 imes 10^5$的大数据,有的数据需要迭代近$4 imes 10^8$次,只需要300+ms左右就能迭代完。下面的代码通过hdu所有数据的测试,只需要900+ms。而且是在没做任何常数优化的情况下。

另外,杨辉三角具有一个性质:用$P_n$表示$n$层三角形中奇数的占比,有:${limlimits_{n o infty}P_n o 0}$。

 

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
int a[MAXN], b[MAXN], n, m;
int main(){
    //freopen("input.txt", "r", stdin);
    int T;
    scanf("%d", &T);
    while(T--){
        scanf("%d%d", &n, &m);
        for(int i = 0;i < n;++i)scanf("%d", a + i);
        memset(b, 0, sizeof(b));
        for(int i = 0;i < n;++i){
            if((((m - 1) + i) & i) == i){
                for(int j = i, k = 0;j < n;++j,++k){
                    b[j] ^= a[k];
                }
            }
        }
//        cout << cnt << " " << clock() - st << endl;
        for(int i = 0;i < n;++i)printf("%d%c", b[i], i == n - 1 ? 
 :  );
    }
    return 0;
}

 

以上是关于HDU多校2017第7场的主要内容,如果未能解决你的问题,请参考以下文章

hdu5379||2015多校联合第7场1011 树形统计

2017多校第7场 HDU 6129 Just do it 找规律

2017多校第9场 HDU 6170 Two strings DP

2017多校第7场 HDU 6128 Inverse of sum 推公式或者二次剩余

2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂

2017多校第8场 HDU 6143 Killer Names 容斥,组合计数