• 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("
    ");
        }
    }
    View Code
  • 相关阅读:
    Java内存分析工具MAT
    jvisualvm安装Visual GC插件
    Jmeter取样器之JDBC Request
    tomcat监控页面
    高并发的参数优化(Tomcat、数据库、linux服务器)
    UITableView自定义Section
    iPhone的动画效果类型及实现方法
    自定义UITableViewCell详细步骤
    扩展NSDate类(NSDateHelper)
    UITableView实现Cell的滑动删除
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3344774.html
Copyright © 2020-2023  润新知