6 3
1
2
6
3
7
4
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) = {0 , 1 , 2 , .... , k - 1}
对于每类数,由于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
#include
using namespace std;
typedef unsigned long long LL;
const int mod=1234567;
int R[100005];
int main(){
int N,K,x;
LL ans=0,sum=0;
scanf("%d%d",&N,&K);
for(int i=1; i<=N; ++i){
scanf("%d",&x);
sum+=x%K;
++R[sum%K];
}
ans=R[0]%mod;
for(int i=0; i>1))%mod;
cout<