在一次偶然的情況下,小可可得到了乙個密碼箱,聽說裡面藏著乙份古代流傳下來的藏寶圖,只要能破解密碼就能開啟箱子,而箱子背面刻著的古代圖示,就是對密碼的提示。
經過艱苦的破譯,小可可發現,這些圖示表示乙個數以及這個數與密碼的關係。假設這個數是 \(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 表示 稱加密後的資訊為密文...