hpu_oj 1192: Sequence

来源:互联网 发布:心知api怎么呐数据 编辑:程序博客网 时间:2024/05/16 17:29
#include <bits/stdc++.h> //有些暴力,没想到10个数也有这么大的复杂度,要过3s#include <cstdio>using namespace std;typedef long long ll;int a[11],book[11],s;ll result,c[60][60];long long f(long long n,long long m){    long long ans=1;    for(long long i=1;i<=m;i++)       ans=ans*(n-m+i)/i;       return ans;}void init(){    for(int i=1;i<=50;i++)     for(int j=1;j<=i;j++)       c[i][j]=f(i,j);}void dfs(int num,int k){    if(11-k<s-num) return;//优化下    if(num==s)    {        ll temp=1;        for(int i=1;i<=10;i++)        {            if(book[i]&&a[i]>1)            {                 ll temp1=0;                 for(int j=1;j<=a[i];j++){temp1+=c[a[i]][j];}                 temp=temp*temp1;            }        }        result=result+s*temp;        return;    }    for(int i=k;i<=10;i++)    {        if(a[i])        {            book[i]=1;            dfs(num+1,i+1);// i+1产生递增有序序列            book[i]=0;        }    }    return;}int main(){    init();    int t;    scanf("%d",&t);    while(t--)    {        memset(a,0,sizeof(a));        result=0;        int n;scanf("%d",&n);        for(int i=0;i<n;i++)        {            int x;            scanf("%d",&x);            a[x]++;        }        int num=0;        for(int i=1;i<=10;i++) if(a[i]) num++;        for(int i=1;i<=num;i++) //枚举价值        {            s=i;            dfs(0,1);         }        printf("%lld\n",result);    }    return 0;}

0 0
原创粉丝点击