---
# System prepended metadata

title: ACL Contest 1 B - Sum is Multiple

---

# ACL Contest 1 B - Sum is Multiple

たのしい
## 問題リンク
- https://atcoder.jp/contests/acl1/submissions/55379447

## 解法
### 準備
まず, $\displaystyle 1+2+\cdots+k=\frac{k(k+1)}{2}$ だから, 求めるべきは $\displaystyle\frac{k(k+1)}{2}$ が $N$ の倍数となるような $k$ の最小値である.



### 記号の定義

ここでひとつ記号を定義しておく.
> 定義: 正整数 $x$と素数 $p$ に対して, $v_p(x)$を $x$ を素因数分解したときの $p$ の指数とする.

たとえば  $v_2(12)=v_2(2^2\times3)=2,v_3(5)=v_3(3^0\times5)=0$です.

また, この $v_p$ について以下の性質が成り立つ:
> 任意の正整数 $x,y$ に対し
> - $v_p(xy)=v_p(x)+v_p(y)$
> -	$y$が $x$ を割り切るならば $\displaystyle{}v_p\left(\frac{x}{y}\right)=v_p(x)-v_p(y)$
> - $x$ が $y$ の倍数であることは, 任意の素数 $p$ に対して $v_p(x)\geq v_p(y)$ が成り立つことと同値.

### 解法

$p$ を任意の素数とする.

$v_p$ の性質を利用すると 

$$v_p\left(\frac{k(k+1)}{2}\right)=v_p(k)+v_p(k+1)-v_p(2)$$ 

が成り立つ. 

よって, $\displaystyle\frac{k(k+1)}{2}$ が $N$ の倍数となることは

$$v_p\left(\frac{k(k+1)}{2}\right)=v_p(k)+v_p(k+1)-v_p(2)\geq v_p(N)$$

すなわち

$$v_p(k)+v_p(k+1)\geq v_p(2N)$$

が任意の素数 $p$ に対して成り立つことと同値. 

ここで, $k,k+1$ は常に互いに素, すなわち $1$ 以外の公約数を持たないということに着目する.

これにより, $v_p(k)\gt0$ と $v_p(k+1)\gt0$ が同時に成り立つことはないとわかる. したがって, $2N$ の素因数分解を $\prod_{i\in I}{p_i^{e_i}}$ とすると, 

- $I_1\cap I_2=\emptyset$
- $I_1\cup I_2=I$

を満たす添え字集合の組 $I_1,I_2$ が存在して以下が成り立つ.

- $k$ は $\displaystyle \prod_{i\in I_1}{p_i^{e_i}}$ の倍数
- $k+1$ は $\displaystyle \prod_{i\in I_2}{p_i^{e_i}}$ の倍数

これらは

- $\displaystyle k\equiv 0\pmod{\prod_{i\in I_1}{p_i^{e_i}}}$
- $\displaystyle k\equiv -1\pmod{\prod_{i\in I_2}{p_i^{e_i}}}$

という形で言い換えることができる. したがって, $I_1,I_2$ を決定すれば, 中国剰余定理より $k$ を求めることができる.

$2N$ の素因数分解はPollardRho法などにより高速に求めることができる.
また, $(I_1,I_2)$ の選び方は $\omega$ を $2N$ の素因数の個数として $O(2^w)$ 通りあり, $\omega=O(\frac{\log N}{\log \log N})$ [らしい](https://37zigen.com/prime-complexity/#i-3)ので, $(I_1,I_2)$ は全探索することが可能.

以上よりこの問題を十分高速に解くことができた.

### 提出
- https://atcoder.jp/contests/acl1/submissions/55379447