蓝桥杯 97 K 倍区间【难】
题目链接:https://www.lanqiao.cn/problems/97/learning/
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int main() {
int n, k;
cin >> n >> k;
ll cnt[N] = {1}; // cnt[r]:前缀和余数为 r 的出现次数,初始 cnt[0]=1
ll sum = 0, ans = 0; // sum 当前前缀和
for (int i = 0; i < n; ++i) {
int num;
cin >> num;
sum += num;
int r = sum % k;
cnt[r]++;
}
for (int i = 0; i < k; ++i) {
ans += cnt[i] * (cnt[i] - 1) / 2;
}
cout << ans << endl;
return 0;
}
如果两个前缀和除以 k 的余数相同,那么它们对应的区间和就是 k 的倍数。所以我们不需要关心具体的区间,只需要统计相同余数的前缀和出现了多少次,就能算出有多少个符合条件的区间。
蓝桥杯 99 分巧克力
题目链接:https://www.lanqiao.cn/problems/99/learning/
#include <iostream>
using namespace std;
N = + ;
h[N], w[N];
n, k;
{
sum = ;
( i = ; i < n; ++i) {
sum += ( * h[i]/mid) * (w[i]/mid);
(sum >= k) ;
}
;
}
{
ios::();
cin.();
cin >> n >> k;
( i = ; i < n; ++i) {
cin >> h[i] >> w[i];
}
l = , r = ;
(l < r) {
mid = (l + r + ) / ;
((mid)) l = mid;
r = mid - ;
}
cout << l << ;
;
}


