Vijos 連續數之和 組合數學

2021-08-09 08:45:07 字數 1503 閱讀 5495

描述

有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

copy

7
copy

各個測試點1s

matrix67 根據經典問題改編

1/*2

我們設sum為字首和

3首先要知道

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

5假設 sum[k]==sum[l] 那麼 sum[k]-sum[l]==0

6也就是 在[l+1,k]這段區間連續的和可以被k整除

7那麼假設 sum[i],sum[j],..sum[k](共bn個)

8都是 mod k 餘數為k-1的sum

9只需要從中任意取兩個 就可以構成乙個連續的區間的和可以整除k

1011

注意餘數為0 要單獨加一次

12*/

13 #include14 #include15

#define maxn 500010

16#define mod 1234567

1718

using

namespace

std;

1920

intn,k;

21long

long

ans,a[maxn];

2223

int b[100010

];24

25 inline void read(int&x)

28while(c>='

0'&&c<='

9')

29 x=x*f;30}

3132 inline int c(int n,int

m) 35

36int

main()

44 ans+=b[0

];45

for(int i=0;i)

49 printf("

%lld\n

",ans);

50return0;

51 }

**

Vijos 1090題 連續數之和

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

異或和之和 組合數學

傳送門 思路 考慮每位對答案的貢獻,因為最大為2 182 218,所以最大一共64位。儲存每乙個1的個數,貢獻產生只能出現兩種情況 p os 1 pos1 pos1 乙個1,兩個0.p os 2 pos2 pos2 三個1。然後用組合數和加法原理對貢獻求和即可。即第i ii位的貢獻ans i c a...

組合數學 卡特蘭數

我們以一道題為例來介紹卡特蘭數 給定n n 個0 0 和n n個1 1,它們將按照某種順序排成長度為2 n 2n的序列,求它們能排列成的所有序列中,能夠滿足任意字首序列中0 0的個數都不少於1 1的個數的序列有多少個。輸出的答案對109 7 109 7取模。109 7 為了便於解決,我們可以把這個問...