描述
有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 為了便於解決,我們可以把這個問...