이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <stdio.h>
#include<vector>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
const int MX = 1000005, 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; }
};// */
//*
struct frac{
    ll A;
		ll B;
		frac(ll A):A(A){}
    frac(ll a, ll b){
			A = rv(b) * a % MM;
    }
    frac(){A = 0;}
    frac operator+ (const frac &l)const{
			return l.A + A >= MM? l.A + A - MM: l.A + A;
    }
    frac operator*(const frac &l)const{
			return l.A * A % MM;
    }
    frac operator/(const frac &l)const{
			return A * rv(l.A) % MM;
    }
    frac operator- (const frac &l)const{
			return A >= l.A? A-l.A: A-l.A + MM;
    }
    ll v(){ return A; }
};// */
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], Q[MX], A[MX], B[MX], C[MX], D[MX], R[MX];
int main()
{
	int N, p, q;
	scanf("%d", &N);
	for(int i = 1; i <= N; i++){
		scanf("%d%d", &p, &q);
		P[i] = frac(p, 1000000000);
		Q[i] = q;
	}
	
	for(int i = 1; i <= N; i++){
		frac mul = 1;
		for(int j = 1; j <= N; j++){
			mul = mul * P[i];
			B[j] = B[j] + mul;
			D[j] = D[j] + mul * Q[i];
		}
	}
	A[0] = 1;
	for(int i = 1; i <= N; i++){
		int p = 1;
		for(int j = i-1; j >= 0; j--){
			A[i] = A[i] + A[j] * B[i-j] * p;
			p = -p;
		}
		A[i] = A[i] / i;
	}
	
	for(int i = 1; i <= N; i++){
		int p = 1;
		for(int j = i-1; j >= 0; j--){
			C[i] = C[i] + A[j] * D[i-j] * p;
			p = -p;
		}
	}
	frac ans = 0;
	p = 1;
	for(int i = 1; i <= N; i++){
		ans = ans + C[i] / i * p;
		p = -p;
	}
	if( ans.v() == 0 ) for(;;);
	printf("%lld\n", ans.v());
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |