杭电第五场多校联系-整数划分-五边形定理

记录一下。五边形定理很强大,这题数据要求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;
}


你可能感兴趣的:(杭电第五场多校联系-整数划分-五边形定理)