E]競技プログラミングhttps://www.codechef.com/MARCH18A/problems/GCDCNTN要素の配列Aがある。これにQ個の2種類のクエリを処理する。https://www.codechef.com/viewsolution/17610281平方分割しよう。s番目のバケット内のiの倍数の数」である。処理に移る前に配列edも事前計算しておく。配列の各要素で、対応するバケットに自分の約数をカウントさせておくが、素因数分解した時に各素因数の指数部が1となるように変えた数の約数だけカウントしておく。することで包除原理がやりやすくなる。クエリ1の場合は、対応するバケットの約数を減らして消したあと、変更後の数で対応するバケットの約数を増やす。クエリ2の場合は、半端なバケットではgcdを取って=1となる物を数え上げる。バケット毎では包除原理で互いに素な個数を数え上げる。(30の倍数)」で互いに素な個数が求まる。2*3*5*7*11*13*17が5*10^5くらいなので、この時使われる素因数は最大7個。よって、この包除原理はO(2^7)が最大である。これでO(Q*sqrt(N)*2^7)で間に合う。F]月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。