简单的排列组合题:英语差一开始在纠结这个digit的意思,后来知道digit是一位数的意思,做法很简单,就是统计每个数的个数,用map记录,如1112,1的个数是3,2的个数是1。z最后计算的时候除去个数的阶乘即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <vector>
using namespace std;
#define ULL unsigned long long
int main(){
ULL digit;
ULL n;
map<int,int> mm;
vector<ULL> num;
while(cin >> n && n!=0){
ULL k = 1;
for(ULL i = 2; i <= n-1; i++){
k *= i;
}
num.clear();
mm.clear();
digit = 0;
for(int i = 0; i < n; i++){
ULL tmp;
scanf("%lld",&tmp);
if(mm[tmp]==0){
num.push_back(tmp);
}
mm[tmp]++;
digit += tmp*k;
}
for(int i = 0; i < num.size(); i++){
int d = 2;
while(mm[num[i]]>1){
digit /= d;
mm[num[i]]--;
d++;
}
}
ULL ans = 0;
for(int i = 0; i < n; i++){
ans *= 10;
ans += digit;
}
cout<<ans<<endl;
}
return 0;
}