题目大意:给你N个数,要求你选出数字连续的子集,使得子集内的数字和能被k整出
解题思路:设dp[i]为余数为i的前缀和出现了几次,如果两次前缀和的余数相等了,表示中间所加的数刚好是k的倍数了,这就可以抽离出来了,将其分成段,再取
#include <cstdio>
#include <cstring>
typedef long long LL;
const int N = 100010;
LL dp[N];
int n, m, cas = 1;
void solve() {
memset(dp, 0, sizeof(dp));
scanf("%d%d", &n, &m);
int sum = 0, t;
LL ans = 0;
dp[0] = 1;
for (int i = 1; i <= n; i++) {
scanf("%d", &t);
sum = (sum + t) % m;
ans += dp[sum];
dp[sum]++;
}
printf("Case %d: %lld\n", cas++, ans);
}
int main() {
int test;
scanf("%d", &test);
while (test--) solve();
return 0;
}