結果
問題 | No.1501 酔歩 |
ユーザー | 👑 tute7627 |
提出日時 | 2021-05-07 23:34:14 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 22,665 bytes |
コンパイル時間 | 3,983 ms |
コンパイル使用メモリ | 248,432 KB |
実行使用メモリ | 26,496 KB |
最終ジャッジ日時 | 2024-09-15 11:39:30 |
合計ジャッジ時間 | 7,887 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
10,624 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 3 ms
5,376 KB |
testcase_03 | AC | 3 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | TLE | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
testcase_27 | -- | - |
testcase_28 | -- | - |
testcase_29 | -- | - |
testcase_30 | -- | - |
testcase_31 | -- | - |
testcase_32 | -- | - |
testcase_33 | -- | - |
testcase_34 | -- | - |
testcase_35 | -- | - |
testcase_36 | -- | - |
testcase_37 | -- | - |
testcase_38 | -- | - |
testcase_39 | -- | - |
testcase_40 | -- | - |
testcase_41 | -- | - |
testcase_42 | -- | - |
testcase_43 | -- | - |
testcase_44 | -- | - |
testcase_45 | -- | - |
testcase_46 | -- | - |
testcase_47 | -- | - |
testcase_48 | -- | - |
testcase_49 | -- | - |
testcase_50 | -- | - |
testcase_51 | -- | - |
testcase_52 | -- | - |
testcase_53 | -- | - |
testcase_54 | -- | - |
testcase_55 | -- | - |
ソースコード
//#define _GLIBCXX_DEBUG #include<bits/stdc++.h> using namespace std; #define endl '\n' #define lfs cout<<fixed<<setprecision(10) #define ALL(a) (a).begin(),(a).end() #define ALLR(a) (a).rbegin(),(a).rend() #define spa << " " << #define fi first #define se second #define MP make_pair #define MT make_tuple #define PB push_back #define EB emplace_back #define rep(i,n,m) for(ll i = (n); i < (ll)(m); i++) #define rrep(i,n,m) for(ll i = (ll)(m) - 1; i >= (ll)(n); i--) using ll = long long; using ld = long double; const ll MOD1 = 1e9+7; const ll MOD9 = 998244353; const ll INF = 1e18; using P = pair<ll, ll>; template<typename T> using PQ = priority_queue<T>; template<typename T> using QP = priority_queue<T,vector<T>,greater<T>>; template<typename T1, typename T2>bool chmin(T1 &a,T2 b){if(a>b){a=b;return true;}else return false;} template<typename T1, typename T2>bool chmax(T1 &a,T2 b){if(a<b){a=b;return true;}else return false;} ll median(ll a,ll b, ll c){return a+b+c-max({a,b,c})-min({a,b,c});} void ans1(bool x){if(x) cout<<"Yes"<<endl;else cout<<"No"<<endl;} void ans2(bool x){if(x) cout<<"YES"<<endl;else cout<<"NO"<<endl;} void ans3(bool x){if(x) cout<<"Yay!"<<endl;else cout<<":("<<endl;} template<typename T1,typename T2>void ans(bool x,T1 y,T2 z){if(x)cout<<y<<endl;else cout<<z<<endl;} template<typename T1,typename T2,typename T3>void anss(T1 x,T2 y,T3 z){ans(x!=y,x,z);}; template<typename T>void debug(const T &v,ll h,ll w,string sv=" "){for(ll i=0;i<h;i++){cout<<v[i][0];for(ll j=1;j<w;j++)cout<<sv<<v[i][j];cout<<endl;}}; template<typename T>void debug(const T &v,ll n,string sv=" "){if(n!=0)cout<<v[0];for(ll i=1;i<n;i++)cout<<sv<<v[i];cout<<endl;}; template<typename T>void debug(const vector<T>&v){debug(v,v.size());} template<typename T>void debug(const vector<vector<T>>&v){for(auto &vv:v)debug(vv,vv.size());} template<typename T>void debug(stack<T> st){while(!st.empty()){cout<<st.top()<<" ";st.pop();}cout<<endl;} template<typename T>void debug(queue<T> st){while(!st.empty()){cout<<st.front()<<" ";st.pop();}cout<<endl;} template<typename T>void debug(deque<T> st){while(!st.empty()){cout<<st.front()<<" ";st.pop_front();}cout<<endl;} template<typename T>void debug(PQ<T> st){while(!st.empty()){cout<<st.top()<<" ";st.pop();}cout<<endl;} template<typename T>void debug(QP<T> st){while(!st.empty()){cout<<st.top()<<" ";st.pop();}cout<<endl;} template<typename T>void debug(const set<T>&v){for(auto z:v)cout<<z<<" ";cout<<endl;} template<typename T>void debug(const multiset<T>&v){for(auto z:v)cout<<z<<" ";cout<<endl;} template<typename T,typename V>void debug(const map<T,V>&v){for(auto z:v)cout<<"["<<z.first<<"]="<<z.second<<endl;} template<typename T>vector<vector<T>>vec(ll x, ll y, T w){vector<vector<T>>v(x,vector<T>(y,w));return v;} ll gcd(ll x,ll y){ll r;while(y!=0&&(r=x%y)!=0){x=y;y=r;}return y==0?x:y;} vector<ll>dx={1,-1,0,0,1,1,-1,-1};vector<ll>dy={0,0,1,-1,1,-1,1,-1}; template<typename T>vector<T> make_v(size_t a,T b){return vector<T>(a,b);} template<typename... Ts>auto make_v(size_t a,Ts... ts){return vector<decltype(make_v(ts...))>(a,make_v(ts...));} template<typename T1, typename T2>ostream &operator<<(ostream &os, const pair<T1, T2>&p){return os << p.first << " " << p.second;} template<typename T>ostream &operator<<(ostream &os, const vector<T> &v){for(auto &z:v)os << z << " ";cout<<"|"; return os;} template<typename T>void rearrange(vector<int>&ord, vector<T>&v){ auto tmp = v; for(int i=0;i<tmp.size();i++)v[i] = tmp[ord[i]]; } template<typename Head, typename... Tail>void rearrange(vector<int>&ord,Head&& head, Tail&&... tail){ rearrange(ord, head); rearrange(ord, tail...); } template<typename T> vector<int> ascend(const vector<T>&v){ vector<int>ord(v.size());iota(ord.begin(),ord.end(),0); sort(ord.begin(),ord.end(),[&](int i,int j){return v[i]<v[j];}); return ord; } template<typename T> vector<int> descend(const vector<T>&v){ vector<int>ord(v.size());iota(ord.begin(),ord.end(),0); sort(ord.begin(),ord.end(),[&](int i,int j){return v[i]>v[j];}); return ord; } ll FLOOR(ll n,ll div){return n>=0?n/div:(n-div+1)/div;} ll CEIL(ll n,ll div){return n>=0?(n+div-1)/div:n/div;} template<typename T>T min(const vector<T>&v){return *min_element(v.begin(),v.end());} template<typename T>T max(const vector<T>&v){return *max_element(v.begin(),v.end());} template<typename T>T acc(const vector<T>&v){return accumulate(v.begin(),v.end(),T(0));}; template<typename T>T reverse(const T &v){return T(v.rbegin(),v.rend());}; //mt19937 mt(chrono::steady_clock::now().time_since_epoch().count()); int popcount(ll x){return __builtin_popcountll(x);}; int poplow(ll x){return __builtin_ctzll(x);}; int pophigh(ll x){return 63 - __builtin_clzll(x);}; template<typename T>T poll(queue<T> &q){auto ret=q.front();q.pop();return ret;}; template<typename T>T poll(priority_queue<T> &q){auto ret=q.top();q.pop();return ret;}; template<typename T>T poll(QP<T> &q){auto ret=q.top();q.pop();return ret;}; template<typename T>T poll(stack<T> &s){auto ret=s.top();s.pop();return ret;}; template< typename T = int > struct edge { int to; T cost; int id; edge():id(-1){}; edge(int to, T cost = 1, int id = -1):to(to), cost(cost), id(id){} operator int() const { return to; } }; template<typename T> using Graph = vector<vector<edge<T>>>; template<typename T> Graph<T> readGraph(int n,int m,int indexed=1,bool directed=false,bool weighted=false){ Graph<T> ret(n); for(int es = 0; es < m; es++){ int u,v,w=1; cin>>u>>v;u-=indexed,v-=indexed; if(weighted)cin>>w; ret[u].emplace_back(v,w,es); if(!directed)ret[v].emplace_back(u,w,es); } return ret; } template<typename T> Graph<T> readParent(int n,int indexed=1,bool directed=true){ Graph<T>ret(n); for(int i=1;i<n;i++){ int p;cin>>p; p-=indexed; ret[p].emplace_back(i); if(!directed)ret[i].emplace_back(p); } return ret; } using cpx = complex<double>; const double PI = acos(-1); vector<cpx> roots = {{0, 0}, {1, 0}}; void ensure_capacity(int min_capacity) { for (int len = roots.size(); len < min_capacity; len *= 2) { for (int i = len >> 1; i < len; i++) { roots.emplace_back(roots[i]); double angle = 2 * PI * (2 * i + 1 - len) / (len * 2); roots.emplace_back(cos(angle), sin(angle)); } } } void fft(vector<cpx> &z, bool inverse) { int n = z.size(); assert((n & (n - 1)) == 0); ensure_capacity(n); for (unsigned i = 1, j = 0; i < n; i++) { int bit = n >> 1; for (; j >= bit; bit >>= 1) j -= bit; j += bit; if (i < j) swap(z[i], z[j]); } for (int len = 1; len < n; len <<= 1) { for (int i = 0; i < n; i += len * 2) { for (int j = 0; j < len; j++) { cpx root = inverse ? conj(roots[j + len]) : roots[j + len]; cpx u = z[i + j]; cpx v = z[i + j + len] * root; z[i + j] = u + v; z[i + j + len] = u - v; } } } if (inverse) for (int i = 0; i < n; i++) z[i] /= n; } vector<int> multiply_bigint(const vector<int> &a, const vector<int> &b, int base) { int need = a.size() + b.size(); int n = 1; while (n < need) n <<= 1; vector<cpx> p(n); for (size_t i = 0; i < n; i++) { p[i] = cpx(i < a.size() ? a[i] : 0, i < b.size() ? b[i] : 0); } fft(p, false); // a[w[k]] = (p[w[k]] + conj(p[w[n-k]])) / 2 // b[w[k]] = (p[w[k]] - conj(p[w[n-k]])) / (2*i) vector<cpx> ab(n); cpx r(0, -0.25); for (int i = 0; i < n; i++) { int j = (n - i) & (n - 1); ab[i] = (p[i] * p[i] - conj(p[j] * p[j])) * r; } fft(ab, true); vector<int> result(need); long long carry = 0; for (int i = 0; i < need; i++) { long long d = (long long) (ab[i].real() + 0.5) + carry; carry = d / base; result[i] = d % base; } return result; } vector<int> multiply_mod(const vector<int> &a, const vector<int> &b, int m) { int need = a.size() + b.size() - 1; int n = 1; while (n < need) n <<= 1; vector<cpx> A(n); for (size_t i = 0; i < a.size(); i++) { int x = (a[i] % m + m) % m; A[i] = cpx(x & ((1 << 15) - 1), x >> 15); } fft(A, false); vector<cpx> B(n); for (size_t i = 0; i < b.size(); i++) { int x = (b[i] % m + m) % m; B[i] = cpx(x & ((1 << 15) - 1), x >> 15); } fft(B, false); vector<cpx> fa(n); vector<cpx> fb(n); for (int i = 0, j = 0; i < n; i++, j = n - i) { cpx a1 = (A[i] + conj(A[j])) * cpx(0.5, 0); cpx a2 = (A[i] - conj(A[j])) * cpx(0, -0.5); cpx b1 = (B[i] + conj(B[j])) * cpx(0.5, 0); cpx b2 = (B[i] - conj(B[j])) * cpx(0, -0.5); fa[i] = a1 * b1 + a2 * b2 * cpx(0, 1); fb[i] = a1 * b2 + a2 * b1; } fft(fa, true); fft(fb, true); vector<int> res(need); for (int i = 0; i < need; i++) { long long aa = (long long) (fa[i].real() + 0.5); long long bb = (long long) (fb[i].real() + 0.5); long long cc = (long long) (fa[i].imag() + 0.5); res[i] = (aa % m + (bb % m << 15) + (cc % m << 30)) % m; } return res; } constexpr int digits(int base) noexcept { return base <= 1 ? 0 : 1 + digits(base / 10); } constexpr int base = 1000'000'000; constexpr int base_digits = digits(base); constexpr int fft_base = 10'000; // fft_base^2 * n / fft_base_digits <= 10^15 for double constexpr int fft_base_digits = digits(fft_base); struct bigint { // value == 0 is represented by empty z vector<int> z; // digits // sign == 1 <==> value >= 0 // sign == -1 <==> value < 0 int sign; bigint(long long v = 0) { *this = v; } bigint &operator=(long long v) { sign = v < 0 ? -1 : 1; v *= sign; z.clear(); for (; v > 0; v = v / base) z.push_back((int) (v % base)); return *this; } bigint(const string &s) { read(s); } bigint &operator+=(const bigint &other) { if (sign == other.sign) { for (int i = 0, carry = 0; i < other.z.size() || carry; ++i) { if (i == z.size()) z.push_back(0); z[i] += carry + (i < other.z.size() ? other.z[i] : 0); carry = z[i] >= base; if (carry) z[i] -= base; } } else if (other != 0 /* prevent infinite loop */) { *this -= -other; } return *this; } friend bigint operator+(bigint a, const bigint &b) { a += b; return a; } bigint &operator-=(const bigint &other) { if (sign == other.sign) { if ((sign == 1 && *this >= other) || (sign == -1 && *this <= other)) { for (int i = 0, carry = 0; i < other.z.size() || carry; ++i) { z[i] -= carry + (i < other.z.size() ? other.z[i] : 0); carry = z[i] < 0; if (carry) z[i] += base; } trim(); } else { *this = other - *this; this->sign = -this->sign; } } else { *this += -other; } return *this; } friend bigint operator-(bigint a, const bigint &b) { a -= b; return a; } bigint &operator*=(int v) { if (v < 0) sign = -sign, v = -v; for (int i = 0, carry = 0; i < z.size() || carry; ++i) { if (i == z.size()) z.push_back(0); long long cur = (long long) z[i] * v + carry; carry = (int) (cur / base); z[i] = (int) (cur % base); } trim(); return *this; } bigint operator*(int v) const { return bigint(*this) *= v; } friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) { int norm = base / (b1.z.back() + 1); bigint a = a1.abs() * norm; bigint b = b1.abs() * norm; bigint q, r; q.z.resize(a.z.size()); for (int i = (int) a.z.size() - 1; i >= 0; i--) { r *= base; r += a.z[i]; int s1 = b.z.size() < r.z.size() ? r.z[b.z.size()] : 0; int s2 = b.z.size() - 1 < r.z.size() ? r.z[b.z.size() - 1] : 0; int d = (int) (((long long) s1 * base + s2) / b.z.back()); r -= b * d; while (r < 0) r += b, --d; q.z[i] = d; } q.sign = a1.sign * b1.sign; r.sign = a1.sign; q.trim(); r.trim(); return {q, r / norm}; } friend bigint sqrt(const bigint &a1) { bigint a = a1; while (a.z.empty() || a.z.size() % 2 == 1) a.z.push_back(0); int n = a.z.size(); int firstDigit = (int) ::sqrt((double) a.z[n - 1] * base + a.z[n - 2]); int norm = base / (firstDigit + 1); a *= norm; a *= norm; while (a.z.empty() || a.z.size() % 2 == 1) a.z.push_back(0); bigint r = (long long) a.z[n - 1] * base + a.z[n - 2]; firstDigit = (int) ::sqrt((double) a.z[n - 1] * base + a.z[n - 2]); int q = firstDigit; bigint res; for (int j = n / 2 - 1; j >= 0; j--) { for (;; --q) { bigint r1 = (r - (res * 2 * base + q) * q) * base * base + (j > 0 ? (long long) a.z[2 * j - 1] * base + a.z[2 * j - 2] : 0); if (r1 >= 0) { r = r1; break; } } res *= base; res += q; if (j > 0) { int d1 = res.z.size() + 2 < r.z.size() ? r.z[res.z.size() + 2] : 0; int d2 = res.z.size() + 1 < r.z.size() ? r.z[res.z.size() + 1] : 0; int d3 = res.z.size() < r.z.size() ? r.z[res.z.size()] : 0; q = (int) (((long long) d1 * base * base + (long long) d2 * base + d3) / (firstDigit * 2)); } } res.trim(); return res / norm; } bigint operator/(const bigint &v) const { return divmod(*this, v).first; } bigint operator%(const bigint &v) const { return divmod(*this, v).second; } bigint &operator/=(int v) { if (v < 0) sign = -sign, v = -v; for (int i = (int) z.size() - 1, rem = 0; i >= 0; --i) { long long cur = z[i] + rem * (long long) base; z[i] = (int) (cur / v); rem = (int) (cur % v); } trim(); return *this; } bigint operator/(int v) const { return bigint(*this) /= v; } int operator%(int v) const { if (v < 0) v = -v; int m = 0; for (int i = (int) z.size() - 1; i >= 0; --i) m = (int) ((z[i] + m * (long long) base) % v); return m * sign; } bigint &operator*=(const bigint &v) { *this = *this * v; return *this; } bigint &operator/=(const bigint &v) { *this = *this / v; return *this; } bigint &operator%=(const bigint &v) { *this = *this % v; return *this; } bool operator<(const bigint &v) const { if (sign != v.sign) return sign < v.sign; if (z.size() != v.z.size()) return z.size() * sign < v.z.size() * v.sign; for (int i = (int) z.size() - 1; i >= 0; i--) if (z[i] != v.z[i]) return z[i] * sign < v.z[i] * sign; return false; } bool operator>(const bigint &v) const { return v < *this; } bool operator<=(const bigint &v) const { return !(v < *this); } bool operator>=(const bigint &v) const { return !(*this < v); } bool operator==(const bigint &v) const { return !(*this < v) && !(v < *this); } bool operator!=(const bigint &v) const { return *this < v || v < *this; } void trim() { while (!z.empty() && z.back() == 0) z.pop_back(); if (z.empty()) sign = 1; } bool isZero() const { return z.empty(); } friend bigint operator-(bigint v) { if (!v.z.empty()) v.sign = -v.sign; return v; } bigint abs() const { return sign == 1 ? *this : -*this; } long long longValue() const { long long res = 0; for (int i = (int) z.size() - 1; i >= 0; i--) res = res * base + z[i]; return res * sign; } friend bigint gcd(const bigint &a, const bigint &b) { return b.isZero() ? a : gcd(b, a % b); } friend bigint lcm(const bigint &a, const bigint &b) { return a / gcd(a, b) * b; } void read(const string &s) { sign = 1; z.clear(); int pos = 0; while (pos < s.size() && (s[pos] == '-' || s[pos] == '+')) { if (s[pos] == '-') sign = -sign; ++pos; } for (int i = (int) s.size() - 1; i >= pos; i -= base_digits) { int x = 0; for (int j = max(pos, i - base_digits + 1); j <= i; j++) x = x * 10 + s[j] - '0'; z.push_back(x); } trim(); } friend istream &operator>>(istream &stream, bigint &v) { string s; stream >> s; v.read(s); return stream; } friend ostream &operator<<(ostream &stream, const bigint &v) { if (v.sign == -1) stream << '-'; stream << (v.z.empty() ? 0 : v.z.back()); for (int i = (int) v.z.size() - 2; i >= 0; --i) stream << setw(base_digits) << setfill('0') << v.z[i]; return stream; } static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) { vector<long long> p(max(old_digits, new_digits) + 1); p[0] = 1; for (int i = 1; i < p.size(); i++) p[i] = p[i - 1] * 10; vector<int> res; long long cur = 0; int cur_digits = 0; for (int v : a) { cur += v * p[cur_digits]; cur_digits += old_digits; while (cur_digits >= new_digits) { res.push_back(int(cur % p[new_digits])); cur /= p[new_digits]; cur_digits -= new_digits; } } res.push_back((int) cur); while (!res.empty() && res.back() == 0) res.pop_back(); return res; } bigint operator*(const bigint &v) const { if (min(z.size(), v.z.size()) < 150) return mul_simple(v); bigint res; res.sign = sign * v.sign; res.z = multiply_bigint(convert_base(z, base_digits, fft_base_digits), convert_base(v.z, base_digits, fft_base_digits), fft_base); res.z = convert_base(res.z, fft_base_digits, base_digits); res.trim(); return res; } bigint mul_simple(const bigint &v) const { bigint res; res.sign = sign * v.sign; res.z.resize(z.size() + v.z.size()); for (int i = 0; i < z.size(); ++i) if (z[i]) for (int j = 0, carry = 0; j < v.z.size() || carry; ++j) { long long cur = res.z[i + j] + (long long) z[i] * (j < v.z.size() ? v.z[j] : 0) + carry; carry = (int) (cur / base); res.z[i + j] = (int) (cur % base); } res.trim(); return res; } }; mt19937 rng(1); bigint random_bigint(int n) { string s; for (int i = 0; i < n; i++) { s += uniform_int_distribution<int>('0', '9')(rng); } return bigint(s); } struct RationalNumber{ using I=bigint; I a, b; RationalNumber(){ a = 0,b = 1; } RationalNumber(I p, I q):a(p), b(q){// a / b reduction(); }; RationalNumber(I p):a(p), b(1){// a / b }; void reduction(){ I g = gcd(a, b); a /= g, b /= g; if(b < 0)a *= -1,b *= -1; } RationalNumber &operator+=(const RationalNumber &x){ I q = b / gcd(b, x.b) * x.b; a = a * (q / b) + x.a * (q / x.b); b = q; reduction(); return *this; } RationalNumber &operator-=(const RationalNumber &x){ I q = b / gcd(b, x.b) * x.b; a = a * (q / b) - x.a * (q / x.b); b = q; reduction(); return *this; } RationalNumber &operator*=(const RationalNumber &x){ I q1 = gcd(a, x.b), q2 = gcd(b, x.a); a = (a / q1) * (x.a / q2), b = (b / q2) * (x.b / q1); return *this; } RationalNumber &operator/=(const RationalNumber &x){ I q1 = gcd(a, x.a), q2 = gcd(b, x.b); a = (a / q1) * (x.b / q2), b = (b / q2) * (x.a / q1); return *this; } RationalNumber operator+(const RationalNumber &x)const{ return RationalNumber(*this) += x; } RationalNumber operator-(const RationalNumber &x)const{ return RationalNumber(*this) -= x; } RationalNumber operator*(const RationalNumber &x)const{ return RationalNumber(*this) *= x; } RationalNumber operator/(const RationalNumber &x)const{ return RationalNumber(*this) /= x; } RationalNumber operator-()const{ return RationalNumber(-a, b); } bool operator==(const RationalNumber &x)const{ return a * x.b == b * x.a; }; bool operator!=(const RationalNumber &x)const{ return !(*this == x); }; bool operator<(const RationalNumber &x)const{ return a * x.b < b * x.a; } bool operator>(const RationalNumber &x)const{ return a * x.b > b * x.a; } bool operator<=(const RationalNumber &x)const{ return *this < x || *this == x; } bool operator>=(const RationalNumber &x)const{ return *this > x || *this == x; } friend ostream &operator<<(ostream &os, RationalNumber x){ return os << x.a << "/" << x.b; } }; using rat=RationalNumber; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); ll res=0,buf=0; bool judge = true; ll n,k;cin>>n>>k;k--; vector<ll>a(n); rep(i,0,n)cin>>a[i]; vector<rat>b(n),c(n); b[0]=bigint(1),c[0]=bigint(0); rep(i,1,n-1){ rat p(a[i-1],a[i+1]+a[i-1]); rat q(a[i+1],a[i+1]+a[i-1]); b[i]=p*b[i-1]/(rat(bigint(1))-p*c[i-1]); c[i]=q/(rat(bigint(1))-p*c[i-1]); } vector<rat>d(n); d[n-1]=bigint(0); rrep(i,0,n-1){ d[i]=b[i]+c[i]*d[i+1]; } if(d[k]==rat(bigint(1)))cout<<0<<endl; else cout<<rat(bigint(1))-d[k]<<endl; return 0; }