質問の意味:
$ N $ $ \ {a_iを\} $、「法的」サブ範囲の定義、および$ K $で割り切れることができるの正の整数の長さの配列です。「法的」のサブセクションの数は、元の配列を含む探していますか?
$ T $のデータセットの合計。
20 \ $ 1 \ T \クワッド1 \ N、5 * 10 ^ 4 \ \カッド1 \ K、10 ^ 6 \ \ 10 ^ 9 $ \ a_iを\クワッド1
分析:
一見、予期せぬ$ O(N \、LOGN)$のアプローチでは\ simのはO(n ^ 2)の約$ O(n)を書き込むための$暴力的なこと。
ここでは$ O(n)と$接頭辞と前処理時間、$ O(N ^ 2)$は、列挙エンドポイントの時間間隔です。たびに$ ANS ++ $の「法的」のサブセクションを見つけました。
(MOD \ $$プレ[R] -pre [L-1] = \和\限界^ {R} _ {i = L} a_iを\は当0 \:我々はこの式に基づいているか、検討、K)$$
(MOD \、K)$$;、明確当量事前[L-1] \ \プレ[R]を$$について、それを適応させます
ショックで病気を死ぬと、私はラインを参照してくださいこの質問オープンバレルをアップ座って!間隔任意の二箇所プレフィックス及びエンドポイントが「合法」からなるので、我々は、各金型$ Kの$残りのバレルが開かれるように$ K $以上でダイがカウントされ、回答を求め使用組み合わせの数。
時間複雑性O(K)、O(N + K)の空間複雑。
実装(100):
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <cmath> の#include <アルゴリズム> の#define ILインライン 使用 名前空間STDを、 const int型 N = 5E4; const int型 K = 1E6; typedefの長い 長いLL。 int型N、T。 LL kを、[N + 3 ]、S [N + 3 ]、C [N + 3 ]、ANS。 INT CNT [K + 3 ]。 INT メイン(){ C [ 0 ] = cを[1 ] = 0 ; C [ 2 ] = 1 。 用(int型 I = 3私は++; iが<= N ) C [i]は [I-= Cを1 ] + I- 1 。 scanf関数(" %のD "、&T)。 一方、(T-- ){ scanf関数(" %のLLD%dの"、&K&N) 以下のために(int型私= 1 ; iが<= N; iが++ ) のscanf(" %のLLD "、および[I])。 memset(CNT、0、はsizeof CNT)。 S [ 0 ] = 0 ; CNT [ 0 ] = 1 ; 以下のために(int型 i = 1 ; iがn = <; iは++ ){ S [i]は =(S [I- 1 ] + [I])%K。 CNT [S [I]] ++ ; } ANS = 0 。 用(int型 I = 0 ; I <K iが++ ) ANS + = C [CNT [i]は]。 printf("%LLD \ n " 、ANS); } 戻り 0 ; }
要約:
カウント、我々は通常、法律を見つけ、変形方程式の原則を置くことができ、$ ANS ++進化$から暴力的なことができます。