Submission #19277

#TimeUsernameProblemLanguageResultExecution timeMemory
19277kaTkaHr능력 (kriii4_S)C++14
0 / 100
16 ms110460 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...