记录一下。五边形定理很强大,这题数据要求100000,用dp肯定是超时的。
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define LL long long
LL p[100005];
int T,n,t;
int main() {
p[0] = 1;
p[1] = 1;
p[2] = 2;
for (int i =3; i <= 100000; i ++) {
for (int j = 1; ; j ++) {
for (int k = 0; k < 2; k ++) {
if (!k) t = (3 * j * j - j) / 2;
else t = (3 * j * j + j) / 2;
if (t > i) break;
if (j % 2 == 1) p[i] += p[i - t];
else p[i] = p[i - t] - 1000000007;
p[i] %= 1000000007;
}
if (t > i) break;
}
}
scanf ("%d", &T);
while (T--) {
int m;
scanf ("%d%d", &n, &m);
printf ("%I64d\n", p[n] - p[n - 2]);
}
return 0;
}