hpuoj 1192 Sequence

来源:互联网 发布:东北大学网络教育查询 编辑:程序博客网 时间:2024/06/01 08:36


点击打开题目


排列组合,

就是依次找出每种价值的排列数。

其实递推一下,

b[n]表示每个数出现的次数。

用c[n];表示从1-n c[i]==价值i的组合数。

c[i]=pow(2,b[n])-1*c[i-1];

当然前面的还要保留。

超int  用 long long

代码:

#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn=50+10;ll c[20];int a[maxn],b[20];;int main(){    int T,n;    scanf("%d",&T);    while(T--){        ll ans=0,t=0,s=0;        memset(b,0,sizeof(b));        memset(c,0,sizeof(c));        scanf("%d",&n);        for(int i=0;i<n;i++){            scanf("%d",&a[i]);            b[a[i]]++;        }int ct=0;        for(int i=1;i<=10;i++) {            if(b[i]!=0)s++;            c[i]=0;        }        for(int i=1;i<=10;i++){            if(b[i]){                ct++;ll t=pow(2,b[i])-1;                for(int j=ct;j>=1;j--){                    if(j==1) c[j]+=t;                    else {                        c[j]+=c[j-1]*t;                    }                }            }        }        for(int i=1;i<=ct;i++){            ans+=i*c[i];//printf("%d %d\n",i,c[i]);        }        printf("%lld\n",ans);    }   return 0;}


0 0
原创粉丝点击