Vijos P1090 連續數之和

2021-07-26 18:50:52 字數 1235 閱讀 7626

時間限制: 1 sec  記憶體限制: 64 mb

有n個正整數排成一行。你的目的是要從中取出乙個或連續的若干個數,使它們的和能夠被k整除。 例如,有6個正整數,它們依次為1、2、6、3、7、4。若k=3,則你可以取出1、2、6,或者2、6、3、7,也可以僅僅取出乙個6或者3使你所取的數之和能被3整除。當然,滿足要求的取法不止以上這4種。事實上,一共有7種取法滿足要求。 給定n和k,以及這n個數。你的任務就是確定,從這n個數中取出其中乙個數或者若干連續的數使它們的和能被k整除有多少方法。 由於取法可能很多,因此你只需要輸出它mod 1234567的值即可。

第一行有兩個正整數,分別代表n和k。輸入資料保證有n小於等於500 000,k小於等於100 000。 以下n行每行乙個正整數。這些正整數保證都不大於10 000。

乙個正整數。它應該是你的答案mod 1234567的結果。

6 312

6374

7

求一段連續位置上數字和,對數列求字首和sum,從第j + 1項到第i項的和:sum[ i ] - sum[ j ]

則( sum[ i ] - sum[ j ] ) % k = 0

->sum[ i ] ≡ sum[ j ] (mod k)且i > j->i >= j + 1(i = j + 1時是單獨的乙個數)

將sum分類,可以用k的剩餘系來表示sum中的一類數,z(k) =

對於每類數,由於i > j,有:(當餘數為k1時,共有n個數餘數為k1)

i = a1, j = a2,a3,a4,....,an(n - 1)組

i = a2 , j = a3, a4,....,an(n - 2)組

....

i = a(n-1) , j = an(1)組

所以對於餘數k1,一共有(n - 1) + (n - 2) + ....+1 = (n - 1)*n / 2

當k1 = 0時, 不僅兩個數一組, 它每個數本身也作為一種方案,共n種

#include#include#includeusing namespace std;

typedef unsigned long long ll;

const int mod=1234567;

int r[100005];

int main()

ans=r[0]%mod;

for(int i=0; i>1))%mod;

cout<

Vijos 1090題 連續數之和

有n個正整數排成一行。你的目的是要從中取出乙個或連續的若干個數,使它們的和能夠被k整除。例如,有6個正整數,它們依次為1 2 6 3 7 4。若k 3,則你可以取出1 2 6,或者2 6 3 7,也可以僅僅取出乙個6或者3使你所取的數之和能被3整除。當然,滿足要求的取法不止以上這4種。事實上,一共有...

3276 連續正整數之和

單點時限 2.0 sec 記憶體限制 256 mb 有些正整數可以表示為 n n 1 個連續正整數的和,如 15 1 2 3 4 5 4 5 6 7 8 給定乙個正整數 n,判斷其是否可以表示為一組連續正整數的和,輸出符合條件的解的組數。輸入格式 第 1 行 乙個整數 t 1 t 10 為問題數。第...

1312 連續自然數和

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 對於乙個自然數m,求出所有的連續的自然數段,使得這些連續自然數段的全部數字和為m.eg 1998 1999 2000 2001 2002 10000,所以從1998到2002的乙個自然數段為m 10000的乙個解。...