Count Lattice Points

2 secs 1024 MB
gorugo30's icon gorugo30

解説

答えは 1+i=1Ngcd(i,M)\displaystyle 1 + \sum_{i = 1}^{N} \mathrm{gcd}(i, M) です。

gcd(i,M)=d\mathrm{gcd}(i, M) = d となる i (1iN)i \ (1\leq i\leq N) の数を dp[d]dp[d] とします。

すると、i=1Ngcd(i,M)=dMd×dp[d]\displaystyle \sum_{i = 1}^{N} \mathrm{gcd}(i, M) = \sum_{d | M} d\times dp[d] です。

DD'ddd|d' かつ dMd'|M である dd' の集合として、dp[d]=NddDdp[d]\displaystyle dp[d] = \frac{N}{d} - \sum_{d'\in D'}dp[d'] と計算することができるので、dd が大きい順に埋めていくことができます。

時間計算量は O(M+{d(M)}2)O(\sqrt{M} + \{d(M)\}^2) です。