Modint

自動でmodを取る構造体です。AC Libraryはmodintを使わなくとも全アルゴリズムが使えるように整備しているので、必ずしもこのファイルの内容を把握する必要はありません。

多くの問題では modint998244353, modint1000000007, modint のどれかを使えば十分で、以下のように使えます。

import atcoder/header
import atcoder/modint

type mint = modint998244353

# print sum of array (mod 998244353)
let n = nextInt()
var sum = mint(0)
for i in 0..<n:
  sum += nextInt()
echo sum.val()

modがfixedでない場合は、modint を使用し以下のように書けます。

import atcoder/header
import atcoder/modint as modint_lib

type mint = modint

# print sum of array (input mod)
let n, M = nextInt()
mint.set_mod(M)
var sum = mint(0)
for i in 0..<n:
  sum += nextInt()
echo sum.val()

以下の関数らは、set_mod を除き $3$ つともに対して動きます。

コンストラクタ

(1) x = modint()
(2) x = modint[T](y:T)

set_mod

set_mod(m:int):void

modを設定します。最初に呼んでください。

制約

計算量

mod

modint.mod():int

modを返します。

val

x.val():int

xに格納されている値を返します。

各種演算

-modint

modint.inc
modint.dec

modint + modint
modint - modint
modint * modint
modint / modint

modint += modint
modint -= modint
modint *= modint
modint /= modint

modint == modint
modint != modint

が動きます。

modint x = 10;
1 + x;

も(modint(1) + xと自動で解釈されるので)動きます。

modint.set_mod(11)
var y = modint(10)
var z = 1234
y * z

y * modint(z)と解釈され、動きます。

制約

計算量

pow

x.pow(ll n):modint

$x^n$ を返します。

制約

計算量

inv

x.inv():modint

$xy \equiv 1$ なる $y$ を返します。

制約

計算量

raw

modint.raw(int x):modint

xに対してmodを取らずに、modint(x)を返す。

定数倍高速化のための関数です。

上で述べたように

var a:modint
var i:int
a += i

は、iがmod以上でも動きます。勝手にiに対してmodを取るためです。

ですが、たとえば以下のようなコードでは、iがmodを超えないことを保証できます。

modint::set_mod(1000000007)
var a = modint(1)
for i in 1..< 100000:
    a += i

このような時に、

modint::set_mod(1000000007)
var a = modint(1)
for i in 1..< 100000:
  a += modint.raw(i)

と書くと、modの回数を減らすことが出来ます。

当然ながらmodint::raw(x)にmod以上の値を入れたときの挙動は未定義です。

制約

Tips(other mod)

問題文で他のmod (例: 1000000009) が与えられる場合、以下のように書けます

type mint = StaticModInt[1000000009]

modint998244353, modint1000000007 は、static_modint<998244353>, static_modint<1000000007>のエイリアスになっています。

type modint998244353 = StaticModInt[998244353]
type modint1000000007 = StaticModInt[1000000007]

Tips(複数mod)

複数種類modを使用したい場合以下のようにできます

type mint0 = DynamicModInt[0]
type mint1 = DynamicModInt[1]

modintは、DynamicModInt[-1]のエイリアスになっています。

type modint = DynamicModInt[-1]

使用例

How to Use

import atcoder/modint type mint = StaticModInt[11] var a = mint(10) b:mint = mint(3) # equal assert a == 21 assert a == -1 assert -1 == a # negative assert -b == 8 # plus assert a + b == 2 # (10 + 3) mod 11 assert 1 + a == 0 # minus assert a - b == 7 # (10 - 3) mod 11 assert b - a == 4 # mul assert a * b == 8 # (10 * 3) mod 11 # inv assert b.inv() == 4 # (3 * 4) mod 11 == 1 # div assert a / b == 7 # (10 * 4) mod 11 # +=, -=, *=, /= a += b assert a == 2 and b == 3 a -= b assert a == 10 and b == 3 a *= b assert a == 8 and b == 3 a /= b assert a == 10 and b == 3 # pow assert mint(2).pow(4) == 5 # 16 mod 11 # print value echo a.val() # 10 # get mod assert mint.mod == 11 and a.mod == 11 # mint(x) と書くとmodを取る操作が発生します((x % mod + mod) % modをmodintに代入します) # mint::raw(x) はxをmodを取らずに代入するので高速です(もちろんxが[0, mod)であることを利用者が保証しないといけません) assert mint.raw(3) == 3