답안 #19278

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
19278 2016-02-24T02:12:21 Z kriii 능력 (kriii4_S) C++14
0 / 100
5 ms 55772 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;
        frac(ll A):A(A){}
    frac(ll a, ll b){
            A = pw(b, MM-2) * 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 * pw(l.A, MM-2) % MM;
    }
    frac operator- (const frac &l)const{
            return A >= l.A? A-l.A: A-l.A + MM;
    }
    ll v(){ return (A%MM+MM)%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], Q[MX], A[MX], B[MX], C[MX], D[MX], R[MX];
 
int main()
{
    int N, p, q;
    frac fac = 1;
 
    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());
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 55772 KB Output is correct
2 Incorrect 4 ms 55772 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Halted 0 ms 0 KB -