HDU-6129 Just do it - 2017 Multi-University Training Contest - Team 7(规律、杨辉三角、组合数奇偶性)

题意:

设b[i] = a[1]^a[2]^a[3]^..................a[i];

每进行一次,a数组会变成一个b数组。问进行m次的结果。

思路:

写出前几项的前几次结果,结果以每个元素的及其用到的个数显示。然后把a[1]的个数抽象出来,会发现是一个斜着的杨辉三角,a[2]则是a[1]的杨辉三角整体向右移一位。所以我们就能得到第m行第j列的元素a[1]的系数是C(m+j-2, j-1)。

然后再通过观察第m行其它列的各个元素的系数,会发现从当前列中元素a[1]的系数,等于下一列的a[2]的系数,等于下下一列的a[3]的系数...

之后需要根据Lucas定理的推广快速判断一个组合数值的奇偶性,其实就是一个式子(n&m) == m?是为奇否为偶。也可以用代码中的方法。


代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int a[maxn], b[maxn];
int isodd(int n, int m)
{
	while(m)
	{
		if((m&1) && !(n&1)) return 0;
		m >>= 1, n >>= 1;
	}
	return 1;
}
int main()
{
	//freopen("in.txt", "r", stdin);
	int n, m, t;
	scanf("%d", &t);
	while(t--)
	{
		scanf("%d %d", &n, &m);
		memset(b, 0, sizeof b);
		for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
		for(int i = 1; i <= n; ++i)
		{
			if(isodd(m+i-2, i-1))
			for(int j = i; j <= n; ++j)
			b[j] ^= a[j-i+1];
		}
		for(int i = 1; i <= n; ++i)
		printf("%d%c", b[i], i==n?'\n':' ');
	}
	return 0;
}


继续加油~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值