切換
舊版
前往
大廳
主題

ZeroJudge - e902: 昴的交響樂 解題心得

Not In My Back Yard | 2020-03-05 00:22:28 | 巴幣 0 | 人氣 326

題目連結:


題目大意:
給定一正整數 T (T ≦ 20923),代表有 T 列輸入。每列給定三正整數 N 、 M 、 L (N 、 M ≦ 10 ^ 10, 1 ≦ L ≦ N,且保證 N 為偶數),代表有 N 首曲子(由左至右編號為 1 ~ N)做了 M 次的「神奇變換」。

神奇變換是指將曲子序列分成左右兩半。並將右邊第一首先放入新的序列、再來是左邊第一首、再來是右邊第二首、左邊第二首……以此類推。全部原先的曲子都放入新序列後,即完成一次神奇變換。此時的新序列將替換掉原有的曲子序列。

求做了 M 次神奇變換後,現在排在由左邊數來的第 L 首曲子原先的編號為何?



範例輸入:
1
6 2 3


範例輸出:
6


解題思維:
可以觀察到原先的序列經過一次變換後:
編號 1 會跑到編號 2 、編號 2 會到編號 4 、……、編號 n ÷ 2 到編號 n 之位置;
編號  n ÷ 2 + 1 會到編號 1 、編號 n ÷ 2 + 2 會到編號 3 、 ……、編號 n 到編號 n - 1 之位置。
寫成通式即為:對於位置 i ,其變換後新位置為 2i (mod (N + 1)),mod 代表取餘(取模),即「%」運算子。

因此做 M 次的神奇變換(假設所求為 X ),X × 2 ^ M (mod (N + 1))≡ L 。

所以 X  = L × (2 模 (N + 1) 下的模反)^ M 。因此要求模反(作法參見以前的文章)。

至於因為 M 很大,所以要使用快速冪這個技巧(參考最初幾篇的文章)。然而又因為 N 也很大,所以如果用一般的乘法有機會超出 64 位元整數能容納的範圍(除非是用類似 python 這種內建大數運算的語言)。所以需要一些技巧(當然直接寫大數乘法也是可行的),而該技巧其實跟快速冪差不了多少,只是將指數換成乘數而已。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

胖胖貓
這題也太神了...
只是分類有點母湯
2020-03-13 00:09:11
Not In My Back Yard
分類?我不是很懂您的意思。
2020-03-13 00:33:51
胖胖貓
他歸類在基礎題庫...
2020-03-13 15:30:31
Not In My Back Yard
可能因為是數論中的基礎吧XD
畢竟還有很多數論黑魔法,這個只是冰山一角而已。
2020-03-13 17:27:06

相關創作

更多創作