泛型程式設計與 OI modint

2022-09-19 23:03:14 字數 919 閱讀 4076

部落格鏈結。

在 oi 中,有大量的題目要求對一些數字取模,這便是本文寫作的背景。

這些題目要麼是因為答案太大,不方便輸出結果,例如許多計數 dp;要麼是因為答案是浮點數,出題人不願意寫乙個確定精度的 special judge,例如很多期望概率題;要麼是因為這道題目直接考察了模的性質和運用,比如大量的 998244353 類的多項式題目。

在這種要求之下,取模運算就成為了程式設計中不可缺少的一部分。下面以式子 \(\texttt=(x+y+z)\times u\) 為例介紹幾種寫法。

這種方法是直接取模,簡單直接,清晰明了。

constexpr int p=998244353;

int ans=1ll*(((x+y)%p+z)%p)*u%p;

但是這種方法有著嚴重的缺陷,一是容易忘記大括號,二是容易中間運算時搞錯運算順序、忘記取模,三是式子太長、括號太多、不易檢驗。

因此,不推薦運用這種方法。

這種方法有效地解決了直接取模的忘記取模的漏洞。

constexpr int p=998244353;

int add(int a,int b)

int sub(int a,int b)

modint(const t& x)

modint operator-(const modint& a)const{

return vx(),y(),z(),u();

modintans=(x+y+z)*u;

這樣使用的時候,一方面減少了心智負擔,不用操心運算時忘記取模;另一方面採取了常數更小的加減法操作,運算更快。

唯一的缺點就是型別名難寫,但是模數個數少的時候可以縮寫,即寫成:

typedef modintmodint1;
這樣就解決了型別名長的缺點。

模板與泛型程式設計

模板是泛型變成的基礎。泛型程式設計 編譯與型別無關的 是一種復用的方式,模板分為模板函式和模板類。模板函式是乙個通用的函式模板,而不是為每一種型別定義乙個新函式,乙個函式模板就像乙個公式,針對不同型別函式生成不同的函式版本。關鍵字 template 以 template 開始,後面跟乙個模板引數列表...

模板與泛型程式設計

泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。模板的格式 template 返回值型別 函式名 引數列表 模板分為類模板和函式模板 模板它本身並不是函式,是編譯...

模板與泛型程式設計

一 函式模板 模板定義以關鍵字template開始,後跟乙個模板引數列表,在模板定義中,模板引數列表不能為空。模板型別引數 型別引數前必須使用class或typename關鍵字。非型別模板引數 表示乙個值而不是乙個型別 陣列引用形參 arr兩端的括號必不可少 void print int arr 1...