题意:给定一个序列
pi = ai^(i mod 1) ^(i mod 2) ...... (i mod n);
ans = p1 ^ p2 ^ p3 ^ p4 ^ p5......^pn;
求ans;
解题思路:因为异或运算符号的交换律。
所以 ans = p1^p2^p3....^pn ^ ( 1 mod 1) ^ (2mod 1) ......(n mod 1) ^(1 mod 2) ^ (2 mod 2)...^(2 mod n) .....^(1 mod n)^(2 mod n) .... ^(n mod n);可以知道两个相同的数异或 为 0 所以 可以预处理快速算出 (1 mod k) ^ (2mod k) ......(n mod k) (1 <= k <= n)
解题代码:
1 // File Name: c.cpp 2 // Author: darkdream 3 // Created Time: 2014年04月25日 星期五 15时21分10秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #include<climits> 25 26 using namespace std; 27 int a[1000005]; 28 int main(){ 29 //freopen("/home/darkdream/problem/input.txt","r",stdin); 30 //freopen("/home/darkdream/problem/output.txt","w",stdout); 31 int n; 32 scanf("%d",&n); 33 int ans =0 ; 34 for(int i = 1 ;i <= n;i ++) 35 { 36 int t ; 37 scanf("%d",&t); 38 ans = ans^t; 39 } 40 a[0] = 0 ; 41 for(int i = 1;i <= n;i ++) 42 { 43 a[i] = a[i-1]^i; 44 } 45 for(int i =1 ;i <= n;i ++) 46 { 47 ans = ans ^ a[n % i]; 48 if((n / i) % 2 == 1 ) 49 ans = ans^a[i-1]; 50 } 51 printf("%d ",ans); 52 return 0; 53 }