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; }
                    
                
                
            
        
浙公网安备 33010602011771号