Problem:
Score : 500 points

Problem Statement

Takahashi and Aoki will play a game. They will repeatedly play it until one of them have N wins in total.

When they play the game once, Takahashi wins with probability A %, Aoki wins with probability B %, and the game ends in a draw (that is, nobody wins) with probability C %.
Find the expected number of games that will be played, and print it as follows.

We can represent the expected value as P/Q with coprime integers P and Q.
Print the integer R between 0 and 10^9+6 (inclusive) such that R \times Q \equiv P\pmod {10^9+7}.
(Such an integer R always uniquely exists under the constraints of this problem.)

Constraints

1 \leq N \leq 100000

0 \leq A,B,C \leq 100

1 \leq A+B

A+B+C=100

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N A B C

Output

Print the expected number of games that will be played, in the manner specified in the statement.

Sample Input 1

1 25 25 50

Sample Output 1

2

Since N=1, they will repeat the game until one of them wins.
The expected number of games played is 2.

Sample Input 2

4 50 50 0

Sample Output 2

312500008

C may be 0.

Sample Input 3

1 100 0 0

Sample Output 3

1

B may also be 0.

Sample Input 4

100000 31 41 28

Sample Output 4

104136146

Solution in JavaScript (node.js v5.12) (judge verdict: Runtime Error)

'use strict';(function(input){
  const K=1e9+7
  const add=((a,b)=>[(a[0]*b[1]+a[1]*b[0])%K,(a[1]*b[1])%K]);
  const mlt=((a,b)=>[(a[0]*b[0])%K,(a[1]*b[1])%K];
  input=input.trim().sprit(/\s+/).map(x=>x-0);
  const [N,A,B,C]=input;
  const dp1=new Array(N).fill(Infinity),
        dp2=new Array(N).fill(Infinity);
  // dp1[i]=[pi,qi]でN対iで高橋くんが勝つ確率
  dp1[0]=[1,1];
  for(let j=0;j<N;j++){
    dp1[0]=mlt([A,A+B],dp1[0]);
  }
  for(let i=1;i<=N-1;i++){
    dp1[i]=mlt(dp1[i-1],mlt([N+i-1,i],[B,A+B]));
  }
  
  dp2[0]=[1,1];
  for(let j=0;j<N;j++){
    dp2[0]=mlt([B,A+B],dp2[0]);
  }
  for(let i=1;i<=N-1;i++){
    dp2[i]=mlt(dp2[i-1],mlt([N+i-1,i],[A,A+B]));
  }
  
  let result=[0,1];
  for(let i=0;i<N;i++){
    result=add(result,mlt(dp1[i],add(mlt([A+C,A],[N,1])),mlt([B+C,B],[i,1])));
    result=add(result,mlt(dp2[i],add(mlt([B+C,B],[N,1])),mlt([A+C,A],[i,1])));
  }
  
  const [P,Q]=result;
  const r=[K,Q];
  while(r[r.length-1]>0){
    r.push(r[r.length-2]%r[r.length-1]);
  }
  r.pop();
  
  const q=[];
  for(let i=0;i<r.length-2;i++){
    q[i]=(r[i]-r[i+2])/r[i+1]
  }
  
  const x=[0,1];
  //r[i]≡x[i]*Q
  //r[i+1]=r[i-1]-r[i]*q[i-1]
  //r[i+1]≡(x[i-1]-q[i-1]*x[i])*Q;
  //x[i+1]=x[i-1]-q[i-1]*x[i]
  for(let i=1;i<r.length-1;i++){
    x[i+1]=x[i-1]-q[i-1]*x[i];
    x[i+1]%=K;
  }
  console.log(x[x.length-1]);
})(require('fs').readFileSync('/dev/stdin','utf8'));