hdu 4762 Cut the Cake概率公式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4762
题目大意:一个圆形蛋糕,现在要分成M个相同的扇形,有n个草莓,求n个草莓都在同一个扇形上的概率。
算法思路:n个草莓在圆形上有一个最左边的,为了好理解,先把假设草莓有1-n的不同编号。 现在从n个草莓中选出一个编号A的放在最左边(这个最左边可以随便放),得到C(n,1)*1.然后把其余的n-1草莓不分先后的放在A的右边角大小为(360)/m的扇形区域内就可以了。 所以概率为 n/(m^(n-1));
由于20^20超 long long了,所以要用高精度。而且要约分。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int GCD(int a,int b) { if(a < b) swap(a,b); if(a % b == 0) return b; return GCD(b,a%b); } int ans[30],cnt; void BigIntergerMul(int n) { int b[3],pv=0; int temp = n; while(temp) { b[++pv] = temp%10; temp /= 10; } if(cnt == 0) { for(int i=1; i<=pv; i++) { ans[i] = b[i]; } cnt = pv; } else { int c[30],cnt1 = 0; memset(c,0,sizeof(c)); for(int i=1; i<=pv; i++) { for(int j=1; j<=cnt; j++) { int mul = b[i]*ans[j]; int wei = j + i - 1; c[wei] += mul; while(c[wei] >= 10){ c[wei+1] += c[wei]/10; c[wei] = c[wei]%10; wei++; } cnt1 = max(wei,cnt1); } } cnt = max(cnt,cnt1); for(int i=1; i<=cnt; i++) { ans[i] = c[i]; } } } int main() { //freopen("E:\\acm\\input.txt","r",stdin); int T; cin>>T; while(T--) { int M,N; cin>>M>>N; cnt = 0; memset(ansff,0,sizeof(ans)); int fenzi = N; for(int i=1; i<N; i++) { int gcd = GCD(M,fenzi); //先分子与M约分,在用高精度相乘,这样不用最后两个高精度来约分。 fenzi = fenzi/gcd; BigIntergerMul(M/gcd); } printf("%d/",fenzi); for(int i=cnt; i>=1; i--) { printf("%d",ans[i]); } printf("\n"); } }