Given a sequence of nn n numbers a1,a2,? ,ana_1, a_2,\cdots, a_n a 1 ? , a 2 ? , ? , a n ? and three functions.
Define a function f(l,r)f(l,r) f ( l , r ) which returns ⊕a[x](l≤x≤r)\oplus a[x] (l \le x \le r) ⊕ a [ x ] ( l ≤ x ≤ r ) . The \oplus⊕ represents exclusive OR.
Define a function g(l,r)g(l,r) g ( l , r ) which returns ⊕f(x,y)(l≤x≤y≤r)⊕f(x,y)\oplus f(x,y)(l \le x \le y \le r)⊕f(x,y) ⊕ f ( x , y ) ( l ≤ x ≤ y ≤ r ) ⊕ f ( x , y ) .
Define a function w(l,r)w(l,r) w ( l , r ) which returns ⊕g(x,y)(l≤x≤y≤r)⊕g(x,y)\oplus g(x,y)(l \le x \le y \le r)⊕g(x,y) ⊕ g ( x , y ) ( l ≤ x ≤ y ≤ r ) ⊕ g ( x , y ) .
You are also given a number of xor-queries. A xor-query is a pair (i,j)(1≤i≤j≤n)(i,j) (1 \le i \le j \le n) ( i , j ) ( 1 ≤ i ≤ j ≤ n ) . For each xor-query (i,j)(i, j) ( i , j ) , you have to answer the result of function w(l,r)w(l,r) w ( l , r ) .
Input Line 11 1 : t(1≤t≤20)t (1 \le t \le 20) t ( 1 ≤ t ≤ 2 0 ) .
For each test case:
Line 11 1 : n(1≤n≤100000)n (1 \le n \le 100000) n ( 1 ≤ n ≤ 1 0 0 0 0 0 ) .
Line 22 2 : nn n numbers a1,a2,? ,an(1≤ai≤109)a_1, a_2, \cdots, a_n (1 \le a_i \le 10^9) a 1 ? , a 2 ? , ? , a n ? ( 1 ≤ a i ? ≤ 1 0 9 )
Line 33 3 : q(1≤q≤100000)q (1 \le q \le 100000) q ( 1 ≤ q ≤ 1 0 0 0 0 0 ) , the number of xor-queries.
In the next q lines, each line contains 22 2 numbers i,ji, j i , j representing a xor-query (1≤i≤j≤n)(1 \le i \le j \le n) ( 1 ≤ i ≤ j ≤ n ) .
It is guaranteed that sum of nn n and q≤106q \le 10^6 q ≤ 1 0 6
Output For each xor-query (i,j)(i, j) ( i , j ) , print the result of function w(i,j)w(i,j) w ( i , j ) in a single line.
樣例輸入 1 5 1 2 3 4 5 5 1 3 1 5 1 4 4 5 3 5 樣例輸出 2 4 0 1 4
解題思路: emmmm,我這道題是通過打表尋找規律來解答的。。。 打表的代碼
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
int arr[100];
int main()
{#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endiffreopen("out.txt", "w", stdout);ios::sync_with_stdio(0),cin.tie(0);for(int l1=1,r1=1;r1<=50;r1++) {memset(arr,0,sizeof arr);for(int l2=l1;l2<=r1;l2++) {for(int r2=l2;r2<=r1;r2++) {for(int l3=l2;l3<=r2;l3++) {for(int r3=l3;r3<=r2;r3++) {for(int k=l3;k<=r3;k++) {arr[k]++;}}}}}//輸出的1代表最后的答案這項存在,0代表不存在for(int i=1;i<=r1;i++) {if(arr[i]%2==0) printf("0 ");else printf("1 ");}printf("\n");//例如假設區間為[l,r],第一行代表當區間長度為1時,其答案就是a[l]//當區間長度為2時,其答案為a[l]^a[r]//當區間長度為3時,其答案為a[l+1]//當區間長度為4時,其答案為0}return 0;
}
通過表格我們可以發現, 當(r?l+1)%4=0(r-l+1) \%4=0 ( r ? l + 1 ) % 4 = 0 時,答案為00 0 ; 當(r?l+1)%4=1(r-l+1) \%4=1 ( r ? l + 1 ) % 4 = 1 時,答案為a[l]⊕a[l+4]⊕a[l+8]?a[r]a[l]\oplus a[l+4] \oplus a[l+8] \cdots a[r] a [ l ] ⊕ a [ l + 4 ] ⊕ a [ l + 8 ] ? a [ r ] 當(r?l+1)%4=2(r-l+1) \%4=2 ( r ? l + 1 ) % 4 = 2 時,答案為a[l]⊕a[l+1]⊕a[l+4]⊕a[l+5]?a[r?1]⊕a[r]a[l]\oplus a[l+1] \oplus a[l+4] \oplus a[l+5] \cdots a[r-1] \oplus a[r] a [ l ] ⊕ a [ l + 1 ] ⊕ a [ l + 4 ] ⊕ a [ l + 5 ] ? a [ r ? 1 ] ⊕ a [ r ] 當(r?l+1)%4=3(r-l+1) \%4=3 ( r ? l + 1 ) % 4 = 3 時,答案為a[l+1]⊕a[l+5]⊕a[l+9]?a[r?1]a[l+1]\oplus a[l+5] \oplus a[l+9] \cdots a[r-1] a [ l + 1 ] ⊕ a [ l + 5 ] ⊕ a [ l + 9 ] ? a [ r ? 1 ] 因為有10610^6 1 0 6 組查詢,所以還需要求一個間隔為44 4 的前綴異或和,這樣就可以實現O(1)O(1) O ( 1 ) 查詢 代碼:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
int arr[100100];
int sum[4][100100];
int main()
{#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endif//freopen("out.txt", "w", stdout);ios::sync_with_stdio(0),cin.tie(0);int t;scanf("%d",&t);while(t--) {int n;scanf("%d",&n);rep(i,1,n) {scanf("%d",&arr[i]);sum[0][i]=sum[1][i]=sum[2][i]=sum[3][i]=0;}sum[1][1]=arr[1];sum[2][2]=arr[2];sum[3][3]=arr[3];sum[0][4]=arr[4];rep(i,5,n) {sum[1][i]=sum[1][i-4]^arr[i];sum[2][i+1]=sum[2][i+1-4]^arr[i+1];sum[3][i+2]=sum[3][i+2-4]^arr[i+2];sum[0][i+3]=sum[0][i+3-4]^arr[i+3];}int q;scanf("%d",&q);rep(i,1,q) {int l,r;scanf("%d%d",&l,&r);int len=r-l+1,ans;if(len%4==0) printf("0\n");else if(len%4==1) {ans=sum[r%4][r]^sum[l%4][l]^arr[l];printf("%d\n",ans);}else if(len%4==2) {ans=sum[r%4][r]^sum[(l+1)%4][l+1]^arr[l+1];ans=ans^(sum[(r-1)%4][r-1]^sum[l%4][l]^arr[l]);printf("%d\n",ans);}else {ans=sum[(r-1)%4][r-1]^sum[(l+1)%4][l+1]^arr[l+1];printf("%d\n",ans);}}}return 0;
}
總結
以上是生活随笔 為你收集整理的【数学】MORE XOR 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。