それから、行かないプッシュを形成することではないでしょう押し込ん〜
問題の愚かな解決を見た後:私は右のプッシュにした何の押し上げがないので、プッシュが行くことではありません。
複雑さは偉大に見えるが、実際には$ O(n)を$償却され、ああ、分析の複雑さが能であることが表示されます
コード:
#include <ビット/ STDC ++。H> #define LL長い長いです #define N 500006 #defineモッズ十億七 #define setIO(S)freopenは(S ".IN"、 "R"、標準入力) 名前空間stdを使用。 int型CNT; INT MU [N]、VIS [N]、第[N]。 (あなたは、Xあなたy)はあなたをqpow { int型TMP = 1; 一方、(Y) { もし(Y&1)TMP =(LL)TMP * X%のMOD。 X =(LL)X * X%のMOD。 Y >> = 1。 } tmpに返します。 } 空の初期化() { 私は、jはint型。 MU [1] = 1。 (; I <N; ++ I I = 2)のための { もしプライム[++ CNT] = I、ミュー[I] = - 1(VIS [i]が!)。 用(J = 1; J <= CNT &&プライム[J] * I <N; ++ j)は { ビュー[プライム*で[J] = 1; (I%プライム[J])の場合 { ミュー[*最初の[J] = - ムー[i]は、 } 他 { ミュー[私が総理* [J] = 0; ブレーク; } } } } 整数N、M。 [N]、合計INT [N]。 INT年= 0; メインint型() { 私は、jはint型。 // setIO( "入力"); 初期化(); scanf関数( "%D%D"、&N、&M)。 (N> M)スワップ(N、M)の場合、 以下のための式(I = 1; I <= M; ++ I)[I] = 1。 用(int型、D = 1; D <= N; ++ D) { (; I <= M / D; ++ iは= 1)のための { [I] =(LL)[I] * I%のMOD。 和[I] =(LL)(和[I-1] + [I])%のMOD。 } int型TMP = 0; (C ++; C <= N / D INT C = 1)のために { TMP =(LL)(TMP +(LL)MU [C] * qpow(C、2 * D)%のMOD *和[N / D / C]%MOD *和[M / D / C]%MOD + MOD) %モッズ; } ANS =(LL)(ANS +(LL)qpow(D、D)* TMP%MOD)%のMOD。 } printf( "%dの\ n" は、ANS)。 0を返します。 }