HDU 2189 悼念512汶川大地震遇难同胞——来生一起走 母函数

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2189

 

该题主要是将每一项素数作为基地,知道系数>150

例如:

(1+x^2+x^4+...+x^150)(1+x^3+x^6+...+x^150)(1+x^5+x^10+...+x^150)...(1+x^149)

注意每一项系数都是素数,然后乘倍增加,直到>150

 

 

代码入下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;

/*
freopen("input.txt",  "r", stdin);  //读数据
freopen("output.txt", "w", stdout); //注释掉此句则输出到控制台
*/

int prime[151],num[151];
int a[151],b[151];

int main()
{
    int i,j,l,tt,n;
    memset(num,0,sizeof(num));
    int k=1;
    for(i=2;i<=150;i++)
        if(num[i]==0)
        {
            prime[k++]=i;
            for(j=i+i;j<=150;j+=i)
                num[j]=1;
        }
    prime[k]=250;//这个地方一定要赋值,不然下面k=prime[i]最后会变成0,无限循环
    memset(a,0,sizeof(a));
    for(i=0;i<=150;i=i+2)
        a[i]=1;
    for(i=2,k=prime[i];k<=150;k=prime[i])//这个地方就是取素数赋值给k,当k>150结束
    {
        memset(b,0,sizeof(b));
        for(j=0;j<=150;j++)//a数组
        {
            if(a[j]==0)//为0直接跳过
                continue;
            for(l=0;j+l<=150;l+=k)//不为0则a的每一位与素数k的函数相乘,知道>150,结果放在b数组中
            {
                b[j+l]+=a[j];
            }
        }
        for(j=0;j<=150;j++)
            a[j]=b[j];
        i++;
    }
    cin>>tt;
    while(tt--)
    {
        scanf("%d",&n);
        printf("%d\n",a[n]);
    }
    return 520;
}


 

你可能感兴趣的:(HDU 2189 悼念512汶川大地震遇难同胞——来生一起走 母函数)