hdu 4762

分蛋糕,求所有草莓落在一块蛋糕上的概率,假设其中一颗草莓在一块蛋糕上,剩下的n-1颗草莓与其落在同一区域的概率就是(1/m)^(n-1);最后再乘上草莓数即Cn即可出解,不过这里数据很大得用到高精度计算。

#include<cstdio>
#include<cstring> 
#include<string>

using namespace std;

struct bign{//高精度运算类 
  int len, s[30]; 

  bign() {//构造函数 
    memset(s, 0, sizeof(s));
    len = 1;
  }

  bign(int num) {//赋值函数为了可以直接初始化赋值所做的操作 
    *this = num;
  }
  
  void clean() {
    while(len > 1 && !s[len-1]) len--;//消除前导零 
  }

  bign(const char* num) {//同上 
    *this = num;
  }

  bign operator = (int num) {//赋值操作将整型转化为字符型 
    char s[30];
    sprintf(s, "%d", num);
    *this = s;
    return *this;
  }

  bign operator = (const char* num) {//赋值操作 
    len = strlen(num);
    for(int i = 0; i < len; i++) s[i] = num[len-i-1] - '0';
    return *this;
  }
  
  bign operator * (const bign& b) {//乘法 
    bign c; 
    c.len = len + b.len; 
    for(int i = 0; i < len; i++)
      for(int j = 0; j < b.len; j++)
        c.s[i+j] += s[i] * b.s[j];
    for(int i = 0; i < c.len-1; i++){
      c.s[i+1] += c.s[i] / 10;
      c.s[i] %= 10;
    }
    c.clean();
    return c;
  }
};

int gcd(int a,int b){
    return b == 0 ? a:gcd(b,a%b); 
}

int main() {
  int t,m,n;   
  bign a;
  scanf("%d",&t);
  while(t--){
      scanf("%d %d",&m,&n);
      a=1;
      int num1=m;
      int num2=n;
      for(int i=1; i<=n-1;i++){
              int num1=m;
              int q=gcd(num1,num2);
              num1/=q; num2/=q;
              a=a*num1;
      }
      printf("%d/",num2);
      for(int i=a.len-1;i>=0;i--)printf("%d",a.s[i]); 
      printf("\n");
  }
  return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值