看到这道题,首先想到的就是用双层for循环,但是这样会超时不能获得完全的分
(蓝桥杯过一个样例就有一部分的分,不是得把所有的样例都过完)
这样就要使用优化了
【既然%K的余数一样,那么用个数组统计余数即可】
#include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int N = 100010; int n, k; LL s[N], cnt[N]; int main() { scanf("%d%d", &n, &k); for (int i = 1; i <= n; i ++ ) { scanf("%lld", &s[i]); s[i] += s[i - 1];//前缀和 } LL res = 0; cnt[0] = 1; for (int i = 1; i <= n; i ++ ) { res += cnt[s[i] % k];//使用数组存储余数 cnt[s[i] % k] ++ ; } printf("%lld\n", res); return 0; }
Code over!