632-擲骰子

632-擲骰子

內存限制:64MB 時間限制:3000ms Special Judge: No

accepted:9 submit:54

題目描述:
小明有m個骰子,小紅有n個骰子。每個骰子都是標準六面骰子。他們分別擲出本身的骰子,若是小明的點數和大,則小明勝;不然小紅勝。求小明勝利的機率。
輸入描述:
有T組數據。每組數據一行,m和n,用空格隔開。1 <= m, n <= 10
輸出描述:
對於每一組數據,輸出小明獲勝的機率。每組輸出佔一行,用四捨五入法,精確到小數點後面6位。
樣例輸入:
複製
1
1 1 
樣例輸出:
0.416667


把一個骰子看做一個式子:x^1+x^2+x^3+x^4+x^5+x^6;ios

指數表明骰子的和,係數表明該組合出現的次數。spa


#include<map>
#include<stack>
#include<queue>
#include<math.h>
#include<vector>
#include<string>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define maxn 105
#define maxm 100005
#define mod 1000000007
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
ll a[maxn],b[maxn];
void sum(int x,ll *d){
    int num=6;
    ll c[maxn];
    mem(c,0);
    for(int i=1;i<=6;i++)d[i]=1;
    x-=1;
    while(x--){
        for(int i=1;i<=6;i++)c[i]=0;
        for(int i=1;i<=num;i++){
            for(int j=1;j<=6;j++){
                c[i+j]+=d[i];
            }
        }
        num+=6;
        for(int i=1;i<=num;i++){
            d[i]=c[i];
            c[i]=0;}
    }
}
int main(){
    int t;scanf("%d",&t);
    while(t--){
        mem(a,0);mem(b,0);
        int n,m;
        scanf("%d%d",&m,&n);
        ll ans=0;
        sum(m,a);sum(n,b);
        for(int i=1*n;i<=n*6;i++){
            for(int j=1;j<=m*6;j++){
                if(j>i)ans+=(a[j]*b[i]);
            }
        }
        int y=n+m;
        ll anss=pow(6,y);
        printf("%.6lf\n",(ans*1.0)/anss);
    }
}
相關文章
相關標籤/搜索