当前位置: 代码迷 >> 综合 >> HOJ 2110 Crisis of HDU(普通母函数,模板题)
  详细解决方案

HOJ 2110 Crisis of HDU(普通母函数,模板题)

热度:97   发布时间:2023-12-13 19:11:39.0

普通母函数,模板题
本题要点:
1、用于多项式相乘的两个数组 sup 和 tmp, 开到 5k
2、用一个变量标记 last 已经处理完的多项式,系数不等于0 的最大次数。
不用每次都要遍历到第 m 项(m项的系数就是答案)
3、 其他的套用母函数的模板。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MaxN = 110, mod = 10000;
int n, sup[5000], tmp[5000], num[MaxN], value[MaxN];
int m;void solve()
{
    memset(tmp, 0, sizeof tmp);memset(sup, 0, sizeof sup);sup[0] = 1;int last = 0;for(int i = 1; i <= n; ++i)	//n条多项式{
    for(int j = 0; j <= last; ++j){
    for(int k = 0; k <= num[i] && k <= m; ++k){
    if(k * value[i] + j <= m){
    last = last > k * value[i] + j ? last : k * value[i] + j;tmp[k * value[i] + j] += sup[j];tmp[k * value[i] + j] %= mod;}}}for(int j = 0; j <= last; ++j){
    sup[j] = tmp[j];}memset(tmp, 0, sizeof tmp);}if(sup[m] == 0){
    printf("sorry\n");}else{
    printf("%d\n", sup[m]);}
}int main()
{
    int sum = 0;while(scanf("%d", &n) != EOF && n){
    sum = 0;for(int i = 1; i <= n; ++i){
    scanf("%d%d", &value[i], &num[i]);sum += value[i] * num[i];}if(sum % 3){
    printf("sorry\n");continue;}m = sum / 3;solve();}return 0;
}/* 2 1 1 2 1 0 *//* 1 */