考場寫的亂搞,現在想到一些讓正確率更高的辦法,我猜可以過,先寫一下大體思路。
首先我們有 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幾乎存在於所有的集體商戶或 個人家庭,在個人家庭有時候會出現忘記密碼的時候,這時候就可以用到今天演示的實驗了,廢話不多說了,開搞 準備工作 我使用的環境是虛擬機器,物理機是...