HDU6129 规律

Posted ( m Lweleth)

tags:

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

LINK

题意:n个数进行m次前缀和异或和后的情况,其中$n,m(1\leq n\leq2\times10^5,1\leq m\leq10^9)$。

思路:看到m这么大,肯定要分解m的,又是异或和,二进制分解后,发现第i的位置上值为与i相距 [m分解后的各个值]位置上的异或,复杂度O(nlogm)。

 

/** @Date    : 2017-08-18 16:10:51
  * @FileName: 1010 规律.cpp
  * @Platform: Windows
  * @Author  : Lweleth ([email protected])
  * @Link    : https://github.com/
  * @Version : $Id$
  */
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 5e5+20;
const double eps = 1e-8;

LL a[N];
int main()
{
	int T;
	cin >> T;
	while(T--)
	{
		LL n, m;
		scanf("%lld%lld", &n, &m);
		for(int i = 0; i < n; i++)
			scanf("%lld", a + i);
		for(int i = 0; i < 32; i++)
		{
			if((m & (1LL << i)) == 0)//注意优先级...
				continue;
			for(int j = 0; j < n; j++)
			{
				if(j - (1 << i) >= 0)
					a[j] ^= a[j - (1 << i)];
				//printf("%lld%s", a[j], j==n-1?"\n":" ");
			}

		}
		for(int i = 0; i < n; i++)
			printf("%lld%s", a[i], i==n-1?"\n":" ");
	}
    return 0;
}

以上是关于HDU6129 规律的主要内容,如果未能解决你的问题,请参考以下文章

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

hdu 6129 Just do it 找规律

HDU 6129 Just do it 数学 杨辉三角 递推

Just do it HDU - 6129 (Lucas)

hdu 6129 Just do it

组合数+Lucas定理2017多校训练七 HDU 6129 Just do it