HDU-1261 字串數

原題:HDU-1261


n種字母排序總共有n!種不同的排法

假如字母B有m個,則字母B1,B2,B3...Bm一共有m!種排法

題目中說要去掉重複的

所以剩下的方法數量爲 n!/m!


#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int gcd(int a,int b) {
    if(b==0) return a;
    else return gcd(b,a%b);
}
int main() {
    int n,a[30],sum[501];//sun儲存結果
    int s2[400],b[27][15];//存儲i便於計算
    while(cin>>n&&n) {
        int i,j,k;
        int s=0;
        for(i=1; i<=n; i++) {
            cin>>a[i];
            s+=a[i];
        }
        for(i=1; i<=s; i++) { //記錄所有個數
            s2[i]=i;
        }
        
        for(k=1; k<=n; k++) {
            for(j=2; j<=a[k]; j++) {
                int m=j;
                while(m>1) {
                    for(i=1; i<=s; i++) {
                        int m1=gcd(s2[i],m);
                        m=m/m1;
                        s2[i]=s2[i]/m1;
                    }
                }
            }
        }
        
        memset(sum,0,sizeof(sum));
        sum[0]=1;
        for(i=1; i<=s; i++) { //模擬相乘沒有約去的值
            int flag=0;
            if(s2[i]!=1)
                for(j=0; j<=500; j++) {
                    int ss=sum[j]*s2[i]+flag;
                    sum[j]=ss%10;
                    flag=ss/10;
                }
        }
        for(i=500; !sum[i]; i--);
        for(j=i; j>=0; j--) {
            cout<<sum[j];
        }
        cout<<endl;
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章