分析:给你n个元素的数组a,让你求所有(ai+aj)(1<=i,j<=n)的异或的值,异或运算:0^0=0;0^1=1;1^0=1;1^1=0。由于ai+aj=aj+ai,所以(ai+aj)^(aj+ai)=0,又a^0=a,所有答案就是所有(ai+ai)(1<=i<=n)的值。
# include <stdio.h>
__int64 a[500005];
int main()
{
int i,n,m,z,l,ans,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&n,&m,&z,&l);
a[1]=0;
for(i=2;i<=n;i++)
a[i]=(a[i-1]*m+z)%l;
for(i=1,ans=0;i<=n;i++)
ans=ans^(a[i]+a[i]);
printf("%d\n",ans);
}
return 0;
}

本文介绍了一种求解特定数组中所有元素两两相加后再进行异或操作的总和算法。通过数学分析简化了问题,实现了高效的计算。代码采用C语言实现,并通过循环完成数组生成与异或计算。
556

被折叠的 条评论
为什么被折叠?



