题目:
给定一个长度为 N的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj之和是 K的倍数,我们就称这个区间 [i,j]是 K倍区间。
你能求出数列中总共有多少个 K倍区间吗?
const int N = 100005;
typedef long long ll;
ll s[N], cnt[N];
ll n, k, ans;
int main()
{
cin >> n >> k;
for(int i = 1; i <= n; i ++)
{
cin >> s[i];
s[i] += s[i - 1];
}
cnt[0] = 1;
for(int i = 1; i <= n; i ++)
{
ans += cnt[s[i] % k] ++;
/*eg:5 % 2 = 1 , 3 % 2 = 1, 5 - 3 = 2 % 2 = 0,
由此可以知道,相同的余数的两个数之间的差值是k的倍数
,每次都要加cnt[s[i]%k]是因为,每增加一组,相当于
新增加的这个数 和前面的所有余数相等的数 之间的差
都可以是k的倍数,相当于又增加了这么多的区间*/
}
cout << ans << endl;
return 0;
}