jzoj 2644列の数

あなたは長さNのシーケンスを与える連続配列、プロモーター配列と、全体のKができるのであれば、正の整数で

削除、そしてこのシーケンス、どのように多くの合法的な連続配列を含む、元の配列の合法的な需要、など?

長さ8の配列について、の場合にはK = 4:2、1、2、1、1、2、1、2。これは、サブシーケンスは、6に対する回答

位置1->位置8,2> 4,2-> 7,3-> 5,4> 6,5> 7です。

 

入力

最初のライン:Tは、データセットを表し

:データの各セットのための

最初の行:番号2、K、N

2行目の:シーケンスを表すN個の

出力

総Tラインは、各ラインは、回答の数を表します。

 

 
単純に数論のようなものを追加します。
私たちは、プレフィックスとストレージを使用します。(すなわち、1からx及び配列)
その後、我々は、k個の区間とで割り切れることができますを探しています、
S1 <S2があります
S1≡S2(モッズk)を満足するように
とよると合同
(S1-S2)≡0(MOD K)
すなわち、S1とS2の金型K Iの等しい数が、kが割り切れる組成範囲とすることができる場合、です。
そして、金型は(高校ではありません接続方法、その上に小学校...)を組み合わせ、その後、ソート、Kの前に付けることができます
あるいは一緒にバレルと、ANS + = T *(T-1)/ 2
すべて単独で0 ANSの残りの部分を結合するために取る必要があり、彼は非常に特別なものだったことを覚えておいてください
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、

INTの和[ 50500 ]、K、T、N。

INT メイン(){ 
    scanf関数(" %のD "、&T)。
    INT O = 1 ; 0 <= T、O ++ ){ 
        scanf関数(" %d個の%のD "、&​​K&N)
        和[ 0 ] = 0 以下のためにint型 i = 1 ; iが<= N; iが++ ){ 
            scanf関数(" %dを"和[I])。
            和[I] =(SUM [I] +和[I- 1 ])%K。
        } 
        ソート(和 + 1、和+ 1個の + N)。
        int型 TT = 0 ; 
        和[ 0 ] = - 10086 int型 ANS = 0 ;
        以下のためにint型 i = 1 ; iは= N <; iは++ ){
             場合(SUM [I] == 0)ANS ++ もし(SUM [I] ==和[I- 1 ]){ 
                TT ++ 
                ANS  + =TT; 
            } 
            そう TT = 0 
        } 
        のprintf(" %d個の\ n " 、ANS)。
    } 
    
    
    戻り 0 
}
コードの表示

 

 

おすすめ

転載: www.cnblogs.com/you-xiao-mang-ci/p/11285360.html