链接:https://ac.nowcoder.com/acm/contest/941/A
来源:牛客网
题目描述
Pi 有一个 n * n 的表格
第 x 行第 y 列写着正整数 x+y-1
m 次询问,每次给出 xl, yl, xr, yr
求第 xl 行到第 xr 行中第 yl 列到第 yr 列这 (xr-xl+1)*(yr-yl+1) 个正整数的异或和
输入描述:
第一行两个正整数 n, m
接下来 m 行每行四个正整数依次为 xl, yl, xr, yr
保证 1≤xl≤xr≤n, 1≤yl≤yr≤n
输出描述:
m 行
每行一个正整数为所求的异或和
示例1
输入
3 1
1 2 2 3
输出
6
说明
(2 ^ 3 ^ 3 ^ 4)==6
备注:
50%
n≤1000,
m≤10000
70%
n≤1000000,
m≤20000
100%
n≤10^9,
m≤2∗10^5
解题思路:
先求出(1,1) 到(x,y)矩阵元素异或和,用容斥可得答案;
方便起见x<y
找一下规律发现:
if x & 1:
(Σ(x+1, y-1): i ++i) ^ (Σ(1, x): i i+=2) ^ (Σ(y, x+y-1): i i+=2)
else:
(Σ(1, x-1): i i+=2) ^ (Σ(y+1, x+y-1): i i+=2)
至于连续数字或连续奇数的异或和也是找规律发现与 %4有关
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace io{
const int SIZE=1e7+10;
char inbuff[SIZE];
char *l,*r;
inline void init(){
l=inbuff,r=inbuff+fread(inbuff,1,SIZE,stdin);
}
inline char gc(){
if(l==r)init();
return(l!=r)?*(l