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场的主要内容,如果未能解决你的问题,请参考以下文章
2017多校第7场 HDU 6129 Just do it 找规律
2017多校第9场 HDU 6170 Two strings DP
2017多校第7场 HDU 6128 Inverse of sum 推公式或者二次剩余