CF#243 C. Magic Formulas- xor异或运算 / 数学

http://codeforces.com/contest/424/problem/C

题意:给

n个数,p1p2p3...pn

qi=pi^(i%1)^(i%2)^.....^(i%n)


Q=q1^q2^......^qn

由于异或的原因,支持交换 操作数。因此我们把qi分离出qi和 剩下部分,全部pi直接异或在一起 

对于所有qi的剩余部分 ,显然 (i%1)^(i%2)^.....^(i%n)  ^ (j%1)^(j%2)^.....^(j%n)  是一个循环节 

也就是会有 (1%1) ^ (1%2) ^ (1%3) .....

^       (2%1) ^(2%2) ^(2%3).....

^       (3%1) ^(3%2)^(3%3)....

也就是说,对于 X %1 部分,会是 0 0 00 00

对%2 部分,值是 1 0 1 0 1 0

%3部分  1 2 0 1 2 0 .....

%k部分 1 2 3 ...k-1 0  1 2 3 ... k-1 

i是循环节长度,我们直接n/i便是循环节个数,显然如果是偶数,相同的数异或为0,总结果为0,如果为奇数,则留下一个完整的循环节,1^2^3^....^(i-1)^0

其次是 n%i,为剩余的循环部分, 1^2^3^....^(n%i)



因此for 一遍,对每个模 求一下异或值

int res=n/i;
if (res%2) ans^=sum[i-1];
res=n%i;
ans=ans^sum[res];


1到k的异或值可以先用前缀和数组算出来


 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std; 
const __int64 N=200005;
__int64 mod=1e9+7;
__int64 min(__int64 a,__int64 b)
{return a>b?b:a; }
int p[1000005];
int sum[1000005];
int main()
{ 
	int n;
	cin>>n;
	int i;
	for (i=1;i<=n;i++) scanf("%d",&p[i]);
	
	sum[1]=1;
	for (i=2;i


你可能感兴趣的:(数据结构,前缀和)