ZJOI2020 密碼亂搞做法

2022-05-05 12:15:10 字數 2153 閱讀 5598

考場寫的亂搞,現在想到一些讓正確率更高的辦法,我猜可以過,先寫一下大體思路。

首先我們有 m 個方程 \(a_i \times x + b_i = c_i (\bmod mod)\),顯然這個模意義方程是可以加減的,我們嘗試構造乙個方程:

\(x + \sum b_i = \sum c_i\),這樣如果 \(b_i\) 個數不多,就可以得到 x 的大體區間範圍。

這時候我們再構造一組方程 \(kx + \sum b_i = \sum c_i\),如果 k 不大,由剛剛求出的 x 範圍,可以發現 kx 範圍也不會很大,很大概率結果除 mod 相同,所以如果相同,我們可以得到乙個新的方程 \(kx = \sum c_i - \sum b_i - p \times mod\),列出不等式 \(\sum c_i - \sum err - p \times mod \le k \times x \le \sum c_i + \sum err - p \times mod\),可以得到乙個更加緊的範圍,也可以繼續更新其他的 k。

下面的問題是如何用比較少的方程構造出乙個 \(kx + \sum b_i = \sum c_i\),其中 k 不能太大。

我們考慮將所有方程按 \(a_i\) 排個序,然後拿 \(a_i\) 相鄰的幾個方程相減,可以得到 \(a_i\) 更加小的一些方程,如此迭代幾次,效果應該不錯,應該迭代層數也不會太大,好像迭代一層,\(max_\) 就會期望變成 \(\frac \log m}\),而且你可以保留更多的方程,\(a_i\) 縮減會更快。

大概按照上面這麼寫就有不少分了,應該可以加入一些隨機化技巧,大膽猜測是可以過掉這題的。

upt: 過了

#includeusing std::cin;

using std::cout;

using std::cerr;

typedef long long ll;

typedef long double ld;

std::mt19937_64 rd(114514);

const int maxn = 100100;

ll mod, err;

inline ll mul(ll x, ll y)

inline ll add(ll x, ll y)

inline ll sub(ll x, ll y)

int t, m;

struct fc a[maxn], a[maxn];

inline bool can(ll x)

return 1;

}ll l, r;

inline int operator < (const fc & x, const fc & y)

inline int operator == (const fc & x, const fc & y)

std::vectorvector;

inline bool mul_less(ll a, ll b, ll c)

inline void update(ll a, ll c, ll b_cnt) }}

inline void emplace(ll a, ll c, ll b_cnt) );

update(a, c, b_cnt);

}inline void reduce()

for(int i = 0;i < 20000;++i) else

} emplace(a, c, 3);

} for(int i = 0;i < 5;++i)

sort(vector.begin(), vector.end());

vector.erase(unique(vector.begin(), vector.end()), vector.end());

for(int size = vector.size(), i = 0;i < size;++i)

} }l -= det, r -= det;

}int main()

l = 0, r = mod - 1;

for(;r - l > 5000;)

l = r = l + r >> 1;

for(;;-- l, ++ r)

if(can(r))

} }// std::cerr << double(clock()) / clocks_per_sec << '\n';

}

ZJOI2020 傳統藝能

把節點分為五類 1.不會進入o的父親且不在祖先終止 與o父親區間不交 2.在o打標記終止 包含o但不能包含o的父親 3.標記了o的祖先 包含o父親 4.下推了o父親標記但沒進入o 與o兄弟有交但與o不交 5.進入o 記錄 f i 表示 i 有標記概率 g i 表示 i 祖先 含 i 有標記概率 矩陣...

ZJOI2003 密碼機 樹狀陣列

一台密碼機按照以下的方式產生密碼 首先往機器中輸入一系列數,然後取出其中一部分數,將它們異或以後得到乙個新數作為密碼。現在請你模擬這樣一台密碼機的運 況,使用者通過輸入控制命令來產生密碼。密碼機中存放了乙個數列,初始時為空。密碼機的控制命令共有3種 add number 把 number 到數列的最...

kali(2020)破解WiFi密碼

隨著網際網路的發展,wifi被發明出來,它是乙個建立於ieee 802.11標準的無線區域網技術。隨著wifi普及,如今wifi幾乎存在於所有的集體商戶或 個人家庭,在個人家庭有時候會出現忘記密碼的時候,這時候就可以用到今天演示的實驗了,廢話不多說了,開搞 準備工作 我使用的環境是虛擬機器,物理機是...