题意:一个蛋糕切成相等的m块,然后n个物品随机放,问随机取出一块能取到n个物品的概率? n,m<=20.
选任意两个物品作为边界 n*(n-1),其角度范围为[0,1/m] (总的角度可以看作m度)
选任意两个物品作为边界 n*(n-1),其角度范围为[0,1/m] (总的角度可以看作m度)
剩下n-2个都要在这之间 x^(n-2)对x[0,1/m]积分.最后答案为n*/(m^(n-1)) 高精度一下即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+20;
const ll inf=2e16;
int ans[10000],cnt;
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
void mul(int x)
{
int pre=0;
for(int i=0;i<cnt;i++)
{
int v=x*ans[i]+pre;
pre=v/10;
ans[i]=v%10;
}
while(pre)
{
ans[cnt++]=pre%10;
pre/=10;
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
scanf("%d%d",&m,&n);
ans[0]=1;
int a=n;
cnt=1;
for(int i=0;i<n-1;i++)
{
int b=m;
int c=gcd(a,b);
a/=c,b/=c;
mul(b);
}
printf("%d/",a);
for(int i=cnt-1;i>=0;i--)
printf("%d",ans[i]);
printf("\n");
}
return 0;
}