猴子排序的期望 高精乘和除 / 组合数学
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猴子排序的期望 高精乘和除 / 组合数学相关的知识,希望对你有一定的参考价值。
https://ac.nowcoder.com/acm/problem/15825
扔N张卡片,次序有N!种可能。故 sum=N!
但是其中可能有重复的组合,设字符A的重复次数为x,则有x!种同一排序,其他字符同理计算。
根据乘法原理,总的重复次数有x1!* x2!* x3!*…xk!。
故去重后的 sum= N! / (x1!* x2!* x3!*…xk! )
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int a[26];
vector<int> mul(vector<int> A,int b)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size()) t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
vector<int> div(vector<int> A,int b)
{
int t=0;
vector<int> C;
for(int i=A.size()-1;i>=0;i--)
{
t=t*10+A[i];
C.push_back(t/b);
t=t%b;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main(void)
{
int n; cin>>n;
string s; cin>>s;
for(int i=0;i<s.size();i++)
{
a[s[i]-'A']++;
}
vector<int> A,B;
A.push_back(1);
for(int i=1;i<=n;i++) //n!
{
B=mul(A,i);
A=B;
}
for(int i=0;i<26;i++)
{
if(a[i]>1)
{
for(int j=a[i];j>=2;j--)// x!
{
B=div(B,j);
}
}
}
cout<<"1/";
for(int i=B.size()-1;i>=0;i--) cout<<B[i];
cout<<endl;
return 0;
}
以上是关于猴子排序的期望 高精乘和除 / 组合数学的主要内容,如果未能解决你的问题,请参考以下文章
新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- 猴子排序的期望
itertools:获取操作( + - * / )和列的组合