洛谷P4296 密碼箱

2022-06-13 15:42:11 字數 866 閱讀 5737

在一次偶然的情況下,小可可得到了乙個密碼箱,聽說裡面藏著乙份古代流傳下來的藏寶圖,只要能破解密碼就能開啟箱子,而箱子背面刻著的古代圖示,就是對密碼的提示。

經過艱苦的破譯,小可可發現,這些圖示表示乙個數以及這個數與密碼的關係。假設這個數是 \(n\),密碼為 \(x\),那麼可以得到如下表述: 密碼 \(x\) 大於等於 \(0\),且小於 \(n\),而 \(x\) 的平方除以 \(n\),得到的餘數為 \(1\)。 小可可知道滿足上述條件的 \(x\) 可能不止乙個,所以一定要把所有滿足條件的 \(x\) 計算出來,密碼肯定就在其中。計算的過程是很艱苦的,你能否編寫乙個程式來幫助小可可呢?

\(x^2\equiv 1\pmod n\) 等價於 \((x-1)(x+1)\bmod n=0\)。

設 \(n=ab\),\(x\) 是解當且僅當存在 \(a,b\) 滿足 \(a|(x-1)\) 且 \(b|(x+1)\)。

設 \(a\leq b\),列舉 \(a\),可以計算出 \(b\),對於每乙個 \(b\) 的倍數我們都令他為 \(x+1\),那麼我們繼續列舉 \(b\) 的倍數,只需要判斷 \(x-1\) 是不是 \(a\) 的倍數即可。

時間複雜度 \(o(n)\),當然這是十分輕鬆的上界。

#include using namespace std;

typedef long long ll;

int n;

sets;

int main()

s.insert(1);

for (set::iterator it=s.begin();it!=s.end();it++)

printf("%d\n",*it);

return 0;

}

洛谷P4296 AHOI2007 密碼箱

鏈結 一道有點意思的題目.主要難點在於想到移項,就是把原式轉化成平方差的形式,然後把 n 拆分成 a,b 這樣做了之後我們就發現 a 整除 x 1 且 b 整除 x 1 或者 a 整除 x 1 且 b 整除 x 1 的時候,x 滿足題意 列舉 a 和 k b 1,k b 1 然後判斷這個 k b 1...

洛谷 P1079 Vigen re 密碼

題目描述 16 世紀法國外交家 blaise de vigen re 設計了一種多表密碼加密演算法 vigen re 密 碼。vigen re 密碼的加密解密演算法簡單易用,且破譯難度比較高,曾在美國南北戰爭中為 南軍所廣泛使用。在密碼學中,我們稱需要加密的資訊為明文,用 m 表示 稱加密後的資訊為...

洛谷 P1079 Vigen re 密碼

題目描述 16 世紀法國外交家 blaise de vigen re 設計了一種多表密碼加密演算法 vigen re 密碼。vigen re 密碼的加密解密演算法簡單易用,且破譯難度比較高,曾在美國南北戰爭中為南軍所廣泛使用。在密碼學中,我們稱需要加密的資訊為明文,用 m 表示 稱加密後的資訊為密文...