poj 3046

来源:互联网 发布:虚拟歌姬软件下载 编辑:程序博客网 时间:2024/06/04 18:18

大溼教我暴力過dp >.<

可重組合計數,是一個典型的生成函數求解的題目。另外,題目的famliy標號是 1 到 t ,沒有這一點的話要用map

最後,題目要求輸出最後6位>.<  差點沒看到。。

#include<stdio.h>#include<string.h>#include<map>using namespace std;#define CLEAR(a) memset(a,0,sizeof(a))#define ET getchar()#define GETS(a) fgets(a,sizeof(a),stdin);a[strlen(a)-1]='\0'//map<int,int>ant;//map<int,int>::iterator ite;const int maxn=100000+5;const int mod=1000000;int ans[maxn],hep[maxn],fam[1005];int main(){    //freopen("1.txt","r",stdin);    int t,a,s,e;    while(~scanf("%d%d%d%d",&t,&a,&s,&e))    {        int id; CLEAR(fam); CLEAR(ans); CLEAR(hep);        //ant.clear();        for(int i=1;i<=a;i++)        {            scanf("%d",&id);            fam[id]++;            //ant[id]++;        }        ans[0]=1;        //for(ite=ant.begin();ite!=ant.end();ite++)        for(int k=1;k<=t;k++)        {            //int x=ite->second;            //for(int i=0;i<=x;i++)            for(int i=0;i<=fam[k];i++)            {                for(int j=0;ans[j]!=0;j++)                {                    hep[i+j]+=ans[j];                    hep[i+j]%=mod;                }            }            for(int i=0;hep[i]!=0;i++)            {                ans[i]=hep[i];                hep[i]=0;            }        }        int answer=0;        for(int i=s;i<=e;i++)        {            answer+=ans[i];            answer%=mod;        }        printf("%d\n",answer);    }    return 0;}


0 0
原创粉丝点击