Submission #19277

# Submission time Handle Problem Language Result Execution time Memory
19277 2016-02-24T02:06:34 Z kaTkaHr 능력 (kriii4_S) C++14
0 / 100
16 ms 110460 KB
#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
1 Incorrect 16 ms 110460 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Halted 0 ms 0 KB -