CF Magic Formulas (XOR運算)

題目大意:

首先給一個整數N,然後輸入n個整數,p1,p2,...,pn;

qi = pi(xor)(i mod 1)(xor)(i mod 2)(xor)...(xor)(i mod n)  (i = 1,2,3,...,n);

Q = q1 (xor) q2 (xor) ... (xor) qn;

要求輸出Q的值;

解題思路:

如果分別求出q1,q2,..qn的值的話,時間肯定會超時,通過化簡可以看到:

Q = p1 (xor) p2 (xor) ... (xor) pn (xor)

       (1 mod 1) (xor) (1 mod 2) (xor) (1 mod 3) (xor) ... (xor) (1 mod n) (xor)

       (2 mod 1) (xor) (2 mod 2) (xor) (2 mod 3) (xor) ... (xor) (2 mod n) (xor)

       (3 mod 1) (xor) (3 mod 2) (xor) (3 mod 3) (xor) ... (xor) (3 mod n) (xor)

... ...
(n mod 1) (xor) (n mod 2) (xor) (n mod 3) (xor) ... (xor) (n mod n);

p1 ^ p2 ^ p3 ^ ... ^ pn是可求的,時間複雜度爲O(n);

下面對取摸的那部分進行分析:

p1  0 ^ 1 ^ 1 ^ 1 ^ 1 ^ ... ^ 1

p2  0 ^ 0 ^ 2 ^ 2 ^ 2 ^ ... ^ 2

p3  0 ^ 1 ^ 0 ^ 3 ^ 3 ^ ... ^ 3

p4  0 ^ 0 ^ 1 ^ 0 ^ 4 ^ ... ^ 4

p5  0 ^ 1 ^ 2 ^ 1 ^ 0 ^ ... ^ 5

構成一個矩陣,上三角的每行的數字都是相同的,如果相同的數字做異或運算,數字個數爲偶數,那麼結果爲0,數字個數爲奇數,那麼結果爲數字本身;

下三角形:

0

0 ^ 0

0 ^ 1 ^ 0

0 ^ 0 ^ 1 ^ 0

0 ^ 1 ^ 2 ^ 1 ^ 0

現在從列考慮這個矩陣,每一列都是 0,1,...pi-1的循環排列,如果循環次數爲偶數,則循環的異或運算結果爲0,否則循環的異或運算結果爲一個循環的異或結果。

然後異或上沒有構成一個完整循環的數字的異或運算。可以通過打表的方法求出tmp[i],(tmp[i] = 0 ^ 1 ^ 2 ^ ... ^ i  (i=1,2,3,...,n));

代碼:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define M 1000005

int p[M], tmp[M];
int main(){
    int n, ans;
    while(~scanf("%d", &n)){
        ans = 0;

        for(int i=0; i<n; i++){
            scanf("%d", &p[i]);
            ans = ans ^ p[i];
            if((n-i-1)%2) ans = ans ^ (i+1);
        }
        memset(tmp, 0, sizeof(tmp));
        tmp[0] = 0;
        for(int i=1; i<n;i++){
            tmp[i] = tmp[i-1] ^ i;
        }

        int tmp1, tmp2;

        for(int i=1; i<=n; i++){
            tmp1 = (n-i+1)%i;
            tmp2 = (n-i+1)/i;
            if(tmp2%2) ans ^= tmp[i-1];
            if(tmp1) ans ^= tmp[tmp1-1];
        }
        printf("%d\n", ans);
    }
    return 0;
}


發佈了62 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章