HDU 6129 規律 數論

2021-08-07 06:11:19 字數 1042 閱讀 5594

給出一串長度為n的序列a,現在對a求m次字首異或和,求最後得到的陣列。

題目不長,但其實隱藏了很多知識點。

首先寫幾行找找規律:

a b c d

a ab abc abcd

a aab aaabbc aaaabbbccd

a aaab aaaaaabbbc aaaaaaaaaabbbbbbcccd

如果只看a的貢獻,可以發現a對第x行,第y列的數的貢獻係數是c(x+y-2,x-1),再來觀察每個位置的a如果係數是xx,那麼a之後的乙個位置b的係數也是xx,同理c,d等係數都是xx,因此,只要求出來乙個位置a的係數,那麼對於之後的每個位置關於bcd的係數也都相同。因為這題需要算異或和,所以要知道組合數c(x+y-2,x-1)的奇偶性。

考慮lucas定理:c(n,m)%p = c(n/p,m/p) * c(n%p,m%p) % p

令p=2,則c(n,m)%2 =c (n/2,m/2) * c(n%2,m%2) % 2

n%2和m%2其實就是n和m的二進位制最後一位,很顯然,如果c(n,m)是奇數,當m的最後一位為1時,n的最後一位也必須為1,否則c(0,1)=0,那麼c(n,m)%2=0,c(n,m)就是偶數了。對於n/2和m/2,其實就是n和m同時二進位制右移一位,因此n和m的每一位都會成為最後一位來比較,根據上面得到的,所以m每個為1的二進位制位,n在這一位也必須是1,否則c(n,m)就是偶數,這種要求等價於(n&m)==m。這樣就可以o(1)判斷組合數奇偶性了。

#include 

using

namespace

std;

const

int maxn = 2e5 + 10;

int a[maxn], b[maxn];

int main()

}//cout << cnt << endl;

for (int i = 1; i <= n; i++)

printf("%d%c", b[i], i == n ? '\n' : ' ');

}return

0;}

HDU 6129 暴力,規律

找規律 列出前幾項,斜著看,是楊輝三角 組合數 異或滿足性質 a oplus b oplus b a 所以只需要關注組合數的奇偶性就可以了 規律是然後發現,對於 a 2 來說,就是 a 1 整體移了一位,所以如果判斷出 c 這是 a 1 在m次變換於 a i 處異或次數,同樣上面的組合數也是 a 2...

折線分割平面 HDU 2050(數論 規律題)

我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c 行資料,每行包含乙個整數n 0output 對於每個測...

jzoj遊戲 規律 數論

description king 很喜歡賭博,這次 king邀請貓老大來玩乙個遊戲。king 拿出了 n 塊 0 input 三行每行乙個數 n 0 output 對於每局,如果 king 必勝則輸出一行 king will win.否則第一行輸出 maolaoda willwin.第二行輸出他第一...