猴子排序的期望 高精乘和除 / 组合数学

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:获取操作( + - * / )和列的组合

UVa 1639 Candy (数学期望+组合数学+高精度存储)

小学生数学算数游戏

洛谷P1080 国王游戏 高精度 贪心 数学推公式