题意:
一块田地坐标从(1,1)到(1000,1000) 每块田地能种(x+A)*(y+B)的蘑菇 问 形似(0,0)(p,0)(p,q)这样的三角形区域能种的蘑菇的数量
思路:
其实很简单 枚举x 根据输入的向量 我们可以求出每个x对应最高的y 然后对于y可以用等差数列求和 再加上y个B 最后乘(x+A)就好了 但是这题时间卡得挺恶心的…
一开始写完T了 输入开挂还T 看了别人的代码发现y那个部分可以提出来打表做(就是代码中的f数组) 本以为稳A了 还是T… 仔细考虑后发现有些变量没必要定义成long long 改完才A… 没什么思维含量 要细心!!
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cassert>
#include<vector>
#include<set>
#include<map>
#include<queue>
using namespace std;
typedef long long LL;
#define N 1010
int T, t, a, b, m, dx, dy, x;
LL ans;
int f[N];
inline void scand(int &ret) {
char c;
ret = 0;
while ((c = getchar()) < '0' || c > '9')
;
while (c >= '0' && c <= '9')
ret = (ret << 3) + (ret << 1) + (c - '0'), c = getchar();
}
int main() {
int i, Y;
scand(T);
for (t = 1; t <= T; t++) {
printf("Case #%d:\n", t);
scand(a);
scand(b);
scand(m);
for (i = 1; i <= 1000; i++)
f[i] = (i + 1) * i / 2 + i * b;
while (m--) {
scand(dx);
scand(dy);
scand(x);
ans = 0;
for (i = 1; i <= x; i++) {
Y = i * dy / dx;
ans += (LL) f[Y] * (a + i);
}
printf("%I64d\n", ans);
}
}
return 0;
}