l1≤q1≤r1,l2≤q2≤r2とします。整数nをm1で割った余りがq1、m2で割った余りがq2である時、整数p1,p2を用いて、n=p1m1+q1=p2m2+q2と表せます。この時、p1m1−p2m2=q2−q1となります。
ここで、m1,m2の最大公約数をgとし、m1=gm1′,m2=gm2′とします。この時、g(p1m1′−p2m2′)=q2−q1となるので、q2−q1がgの倍数でない場合、これを満たす(p1,p2)の組は存在しません。
q2−q1がgの倍数である時、q2−q1=kg(kは整数)とおけるので、p1m1′−p2m2′=kとなります。m1′,m2′は互いに素なので、これを満たす(p1,p2)の組は必ず存在します。そのうちの1つを(s1,s2)とすると、s1m1′−s2m2′=kとなるので、m1′(p1−s1)=m2′(p2−s2)となります。m1′,m2′は互いに素なので、p1−s1=m2′k′(k′は整数)となります。よって、p1=m2′k′+s1より、n=m1m2′k′+m1s1+q1=gm1m2k′+m1s1+q1となります。よって、(q1,q2)の値を固定した場合、条件を満たすnの周期はgm1m2となるので、0≤n<m1m2の範囲に条件を満たすnはg個存在します。
よって、q2−q1がgの倍数となるような(q1,q2)の組の数をnq1,q2とすると、求める答えはgnq1,q2です。
nq1,q2の求め方
0≤i<gとし、l1≤q1≤r1内において、gで割った余りがiとなるようなq1の数をA1,iとします。また、l2≤q2≤r2内において、gで割った余りがiとなるようなq2の数をA2,iとします。この時、nq1,q2=A1,0A2,0+A1,1A2,1+⋯+A1,g−1A2,g−1となります。
ここで、A1,iの値について考えてみます。gの倍数の中で、l1より大きい物の中で最小の物をl1′、r1以下で最大の物をr1′とします。この時、t=gr1′−l1′とすると、l1′≤q1≤r1′−1にはgで割った余りが0,1,⋯,g−1の物がt個ずつ含まれています。また、l1,r1をgで割った余りをそれぞれl1′′,r1′′とすると、l1≤q1≤l1′−1にはgで割った余りがl1′′,l1′′+1,⋯,g−1の物が1個ずつ含まれており、またr1′≤q1≤r1にはgで割った余りが0,1,⋯,r1′′の物が1個ずつ含まれています。よって、A1,iの値は、
l1′′≤r1′′の場合、A1,i=⎩⎨⎧t+1t+2t+1ififif0≤i≤l1′′−1l1′′≤i≤r1′′r1′′+1≤i≤g−1
l1′′=r1′′+1の場合、A1,i=t+1
l1′′≥r1′′+2の場合、A1,i=⎩⎨⎧t+1tt+1ififif0≤i≤r1′′r1′′+1≤i≤l1′′−1l1′′≤i≤g−1
となります。なお、以下の図を見るとイメージしやすいです。
l1′′≤r1′′の場合
i mod g | 0 | ⋯ | l1′′ | ⋯ | r1′′ | ⋯ | g−1 |
---|
l1≤q1≤l1′−1 | | | ○ | ⋯ | ⋯ | ⋯ | ○ |
r1′≤q1≤r1 | ○ | ⋯ | ⋯ | ⋯ | ○ | | |
l1′′=r1′′+1の場合
i mod g | 0 | ⋯ | r1′′ | l1′′ | ⋯ | g−1 |
---|
l1≤q1≤l1′−1 | | | | ○ | ⋯ | ○ |
r1′≤q1≤r1 | ○ | ⋯ | ○ | | | |
l1′′≥r1′′+2の場合
i mod g | 0 | ⋯ | r1′′ | ⋯ | l1′′ | ⋯ | g−1 |
---|
l1≤q1≤l1′−1 | | | | | ○ | ⋯ | ○ |
r1′≤q1≤r1 | ○ | ⋯ | ○ | | | | |
いずれの場合についても、iを0からg−1まで増やした時のA1,iの値の変化は高々2回となります。A2,iについても同様に考えることで、値の変化は高々2回となります。よって、区間[0,g−1]をA1,i,A2,iの変化点で区切っても、区切りは高々4つなので、区間は高々5分割となります。よって、それぞれの区間に対してA1,iA2,iの値を求めれば良いです。
以上より、nq1,q2の計算はO(1)で行えるので、プログラム全体の計算量はO(logmin(a,b))となります。
解答例は以下の通りです。
質問・誤りがある場合
Twitterに連絡ください。ID : @YS55749378