UOJ 74 UR 6 破解密碼

2022-03-13 10:23:46 字數 1221 閱讀 1942

題目中,將字串 s 的第乙個字元移到末尾,其他字元向前移動乙個位置,f(s) 就從 hi 變成了 hi+1。

我們分析一下這個過程:假設第乙個字元為 c, (hi - 26^(n-1) * c) * 26 + c = hi+1

26 * hi - hi+1 = (26^n - 1) * c

c = (26 * hi - hi+1) * inv(26^n - 1)

那麼每乙個 c 都可以直接解出來,由於題目保證有解,所以每乙個 c 解出來的一定都是 [0, 25] 的數。

嗯..看起來非常對..提交上去....wa.50

為什麼只得了50分呢?因為:「有除法的時候一定要考慮沒有逆元的情況!

當 (26^n - 1) % p = 0 的時候,26^n - 1 是沒有逆元的。而這樣的點在資料裡有 5 個 【qaq】。

這樣在前面的方程 26 * hi - hi+1 = (26^n - 1) * c 中含有 c 的項係數為 0,被消去,變成了 hi * 26 = hi+1 。

因為方程與 c 無關,所以 c 是任何乙個字母這個方程都可以成立。

那麼就要根據 f(s) = hi 來求出這個 s 了,我們知道 f(s) 相當於是把字串看做乙個 26 進製數,然後這裡的 hi * 26 = hi+1。

所以我們把 h0 看做26進製數求出對應的字串,之後向左移一位就相當於將 h 乘了 26 ,依然是符合 f(s) = hi+1 的。

#include #include #include #include #include #include using namespace std;

const int maxn = 100000 + 5;

typedef long long ll;

int n, p, t;

int h[maxn];

ll a0, temp;

ll x[maxn];

ll pow(ll a, int b)

b >>= 1;

f *= f;

f %= p;

} return ret;

}ll ny(ll x)

int main()

} else }

for (int i = 0; i < n; ++i) printf("%c", 'a' + x[i]);

printf("\n");

return 0;

}

UOJ 74 UR 6 破解密碼

uoj 發現這個過程是乙個字串雜湊的過程。把第一位單獨拿出來考慮,假設這個串是 p s 旋轉後變成了 s p 其雜湊值分別是 p 26 hash s 和 hash s 26 p 那麼 h i 26 h i 1 p 26 p 那麼這裡顯然可以直接把 p 給解出來。這樣子就可以還原出每一位了。注意到特殊...

UOJ 74 UR 6 破解密碼(數學相關)

傳送門 其實這道題就是給了你乙個串的n個hash值然後讓你還原原串 首先乙個非常顯然的式子 h i 1 h i c i 26n 1 26 c i modp 然後化簡一下 c i h i 1 h i 1 26n這樣就可以根據h來推出c了 可是這樣還有乙個問題 考慮26n 1 modp 的情況,此時若h...

UOJ 192 UR 14 最強跳蚤

題目鏈結 暑期課第二天 樹上問題高階 具體內容看筆記部落格吧 題意n個節點的樹t 邊有邊權w 求滿足 u,v 上所有邊權乘積為完全平方數的路徑有多少條 看到 所有邊權乘積為完全平方數 想到完全平方數的特殊性 就是分解質因數後 質因數指數都為偶數 然後就想到分解邊權質因數 判質路徑邊權奇偶性 後者由於...