답안 #19267

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
19267 2016-02-23T15:34:03 Z kaTkaHr 제비 (kriii4_W) C++14
0 / 100
2000 ms 142176 KB
#include <stdio.h>
#include<vector>
#include <algorithm>
#include <map>

using namespace std;

typedef long long ll;

const int MX = 3005, MM = 1000000007;

ll pw(ll A, ll B){
    ll R = 1;
    while(B){
        if( B&1 ) R = R * A % MM;
        A = A * A % MM; B /= 2;
    }
    return R;
}


ll rv(ll A){ return pw(A, MM-2); }

struct frac{
    ll A, B;
		frac(ll A):A(A), B(1){}
    frac(ll a, ll b){
        A = (a%MM+MM) % MM;
        B = (b%MM+MM) % MM;
    }
    frac(){A = 0, B = 1;}
    frac operator+ (const frac &l)const{
        return frac((A * l.B + B * l.A) % MM, B * l.B % MM);
    }
    frac operator*(const frac &l)const{
        return frac(A*l.A % MM, B*l.B % MM);
    }
    frac operator/(const frac &l)const{
        return frac(A*l.B % MM, B*l.A % MM);
    }
    frac operator- (const frac &l)const{
        return frac((A*l.B - B*l.A%MM + MM) % MM, B*l.B % MM);
    }
    ll v(){ return A * rv(B) % MM; }
};

frac pw(frac A, ll B){
    frac R = 1;
    while(B){
        if( B&1 ) R = R * A;
        A = A * A; B /= 2;
    }
    return R;
}

frac P[MX][MX];

int main()
{
	int R, G, B, K, T;
	int TT;
	scanf("%d", &TT);
	for(int tt = 1; tt <= TT; tt++){
		scanf("%d%d%d%d", &R, &G, &B, &K);
		for(int i = 0; i <= R; i++) P[i][K] = 0;
		for(int i = R; i >= 0; i--){
			for(int j = K-1; j >= 0; j--){
				int T = R + G + B - i;
				P[i][j] = P[i][j+1] * frac(B, T) + 1;
				if( i < R ) P[i][j] = P[i][j] + P[i+1][j] * frac(R-i, T);
				P[i][j] = P[i][j] * frac(T, T-G);
			}
		}
		printf("%lld\n", P[0][0].v());
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 576 ms 142176 KB Output is correct
2 Correct 833 ms 142176 KB Output is correct
3 Correct 304 ms 142176 KB Output is correct
4 Execution timed out 2000 ms 142176 KB Program timed out
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Halted 0 ms 0 KB -