hdu4762(概率题,大数)

src: http://acm.hdu.edu.cn/showproblem.php?pid=4762

c++写大数模版的乘法中,例a*b,则a的第i位*b的第j位的结果存到ret的i+j位开始的位置~~~

以落在最左边的一颗来考虑,其余落在其右边概率为1/m^(n-1),考虑每一个都可能在最左,实际上就是乘以C(1,n)可以推出来概率公式为n / (m^(n-1))。然后用高精度就ok了,记得最后约分就行了。  其实就是说根据位置分布还要乘以C(1,n)

理解:因为要可能让所有草莓在范围内,所以(注意是先撒草莓再切)某个草莓要在边界上,就有了n中第一刀的切法,*n就这么来的

如果是先均匀切好再撒草莓,就是1/m^(n-1)了嘛~~~

ac代码:

//#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include <cstdlib>
#include<malloc.h>
#include<algorithm>
#include<functional>
#include<utility>
#include<cmath>
#include<string.h>
#include<string>
#include<vector>
#include<stack>
#include<set>
#include<queue>
#include<list>
#include<iomanip>
//#include<bits/stdc++.h>
using namespace std;
int Max(int a, int b) { return a > b ? a : b; }
int Min(int a, int b) { return a > b ? b : a; }
#define FOR(i,a,b) for(int i=a;i<=b;i++)
typedef long long LL;
typedef unsigned long long ull;
const int INF = 999999900;
#define maxsize 50
#define maxn 9999
class BigNum
{
public:
    int a[maxsize];//数组中一个元素存四位正数
    int len;
public:
    BigNum() { len = 1; memset(a, 0, sizeof(a)); }
    BigNum(int n);
    BigNum(const char*s);
    BigNum(const BigNum&T);

    friend istream& operator>> (istream&, BigNum&);
    friend ostream& operator<<(ostream&, BigNum);

    BigNum operator+(BigNum t);
    BigNum operator*(const BigNum& t);

    BigNum operator^(int n);
};
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    std::ios::sync_with_stdio(false);
    int cas;
    cin>>cas;
    int m,n,a,b,c;
    while(cas--){
        cin>>m>>n;
        BigNum s(1);
        a=n;
        for(int i=1;i<n;i++){
            b=m;
            c=gcd(a,m);
            a/=c;b/=c;
            s=(s*b);
        }
        cout<<a<<'/';
        cout<<s<<endl;
    }
    /*BigNum t(5);
    BigNum tt=(t^8);
    cout<<tt<<endl;*/
    return 0;
}

BigNum::BigNum(int n)
{
    int c;
    len = 0;
    memset(a, 0, sizeof(a));
    while (n>maxn) {
        c = n % (maxn + 1);
        n /= (maxn + 1);
        a[len++] = c;
    }
    a[len++] = n;
}
BigNum::BigNum(const char*s)
{
    len = 0;
    memset(a,0,sizeof(a));
    int l = strlen(s);
    int Len = l / 4;
    if (Len * 4<l)Len++;
    int tmp = 0, pos = l - 1;
    FOR(i, 1, Len) {
        tmp = 0;
        FOR(j, 1, 4) {
            if (pos<0)break;
            double add = (s[pos] - '0')*pow(10, j - 1);
            tmp += (int)add;
            pos--;
        }
        a[len++] = tmp;
        cout << "add success:" << tmp << endl;
    }
}
BigNum::BigNum(const BigNum&T):len(T.len)
{
    memset(a,0,sizeof(a));
    for(int i=0;i<len;i++)a[i]=T.a[i];
}
ostream& operator<<(ostream&out, BigNum t)
{
    cout<<t.a[t.len-1];
    for (int i = t.len - 2; i >= 0; i--) {
        out << setw(4)<<setfill('0')<<t.a[i];
    }
    return out;
}
istream& operator>> (istream&in, BigNum& b)
{
    b.len = 0;
    char s[maxsize * 4];
    in >> s;
    int l = strlen(s), Len = l / 4;
    if (l>Len * 4)Len++;
    for (int i = l - 1; i >= 0;) {
        int sum = 0, t = 1;
        for (int j = 1; j <= 4 && i >= 0; j++, i--, t *= 10) {
            sum += (s[i] - '0')*t;
        }
        b.a[b.len++] = sum;
    }
    return in;
}
BigNum BigNum::operator+(BigNum b)
{
    BigNum t(*this);
    int L=max(t.len,t.len);
    for(int i=0;i<L;i++){
        t.a[i]+=b.a[i];
        if(t.a[i]>maxn){
            t.a[i+1]++;
            t.a[i]%=(maxn+1);
        }
    }
    if(t.a[L]!=0)t.len=L+1;
    else t.len=L;
    return t;
}
BigNum BigNum::operator*(const BigNum& t)
{
    BigNum ret;
    int i,j,up=0;
    int tmp;
    for(i=0;i<len;i++){
        up=0;
        for(j=0;j<t.len;j++){
            tmp=a[i]*t.a[j]+ret.a[i+j]+up;
            if(tmp>maxn){
                up=tmp/(maxn+1);
                ret.a[i+j]=tmp%(maxn+1);
            }
            else {
                up=0;
                ret.a[i+j]=tmp;
            }
        }
        if(up!=0){
            ret.a[i+j]=up;
        }
    }
    ret.len=i+j;
    while(ret.a[ret.len-1]==0&&ret.len>1)ret.len--;
    return ret;
}
BigNum BigNum::operator^(int tt)
{
    BigNum ret(*this);
    for(int i=1;i<tt;i++){
        ret=ret**this;
    }
    return ret;
}

 

posted @ 2018-04-14 22:07  WindFreedom  阅读(124)  评论(0)    收藏  举报