Submission #102510


Source Code Expand

#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
#include<cassert>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<complex>

using namespace std;
typedef long long LL;
//typedef double LDouble;
//typedef long double LDouble;
typedef __float128 LDouble;
//typedef long long double LDouble;

//typedef complex<LDouble> Complex;


const double INF = 1e12;

typedef vector<LDouble> Poly;

// a*b where x^n = c
Poly mulPoly(const Poly&a, const Poly&b, const Poly&c) {
    int n=a.size();
    Poly r(n*2);
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            r[i+j] = (r[i+j]+a[i]*b[j]);
        }
    }
    for (int i=n*2; i-->n; ) {
        for (int j=1; j<=n; j++) {
            r[i-j] = (r[i-j]+r[i]*c[n-j]);
        }
    }
    r.resize(n);
    //for (int i=0; i<n; i++) assert(abs((double)r[i]) < INF);
    return r;
}

Poly powPoly(Poly a, LL y, const Poly&c) {
    int n = a.size();
    Poly r(n);
    r[0]=1;
    for (;y; y>>=1) {
        if (y&1) r = mulPoly(r, a, c);
        a = mulPoly(a, a, c);
    }
    return r;
}


int main() {
    //printf("double %d\n__float128 %d\nlong double %d\n", sizeof(double), sizeof(__float128), sizeof(long double));
    double _p, _q, _r;
    LDouble p, q, r;
    LL N, K, M;
    cin >> _p >> _q >> _r;
    cin >> N >> K >> M;
    p=_p; q=_q; r=_r;

    vector<LDouble> v(N*K+1);
    LDouble base = p+q+r;
    v[0] += -r / base;
    v[1] += r / base;
    v[N*(K-1)] += -p /base;
    v[N*(K-1) + 1] += p / base;
    v[N*K-1] += -q / base;
    v[N*K] += (p+2*q+r) / base;


    vector<LDouble>alpha(N*K+1);
    for (int i=1; i<=N*K; i++) {
        alpha[i] = (i>=N ? p*alpha[i-N] : 0) 
            + (i>=1 ? q*alpha[i-1] : 0)
            + (i>=N*K ? r*alpha[i-N*K] : 0)
            + 1;
        alpha[i] /= base;
    }

    //for (int i=0; i<N*K+1; i++) { printf("%d %f\n", i, double(alpha[i])); } puts("");
    Poly beta(N*K+1);
    beta[1]=1;
    beta = powPoly(beta, M*N, v);
    //for (int i=0; i<N*K+1; i++) { printf("%d %f\n", i, double(beta[i])); } puts("");

    LDouble ans=0;
    for (int i=0; i<N*K+1; i++) ans += beta[i] * alpha[i];

    printf("%.9f\n", double(ans));
    //cout << ans << endl;

    return 0;
}

Submission Info

Submission Time
Task B - Cans of Toys
User YellowYell
Language C++ (GCC 4.4.7)
Score 0
Code Size 2339 Byte
Status TLE
Exec Time 1535 ms
Memory 1076 KB

Judge Result

Set Name all
Score / Max Score 0 / 100
Status
AC × 32
TLE × 17
Set Name Test Cases
all 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 4, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 5, 6, 7, 8, 9
Case Name Status Exec Time Memory
1 AC 24 ms 800 KB
10 AC 22 ms 796 KB
11 AC 21 ms 792 KB
12 AC 23 ms 920 KB
13 TLE 1532 ms 920 KB
14 AC 448 ms 852 KB
15 AC 22 ms 796 KB
16 AC 193 ms 924 KB
17 AC 1469 ms 916 KB
18 TLE 1530 ms 1060 KB
19 AC 1157 ms 920 KB
2 AC 23 ms 796 KB
20 AC 328 ms 920 KB
21 AC 187 ms 816 KB
22 AC 802 ms 920 KB
23 AC 68 ms 812 KB
24 AC 22 ms 920 KB
25 AC 22 ms 792 KB
26 AC 21 ms 800 KB
27 TLE 1530 ms 1068 KB
28 AC 23 ms 792 KB
29 AC 24 ms 848 KB
3 AC 22 ms 800 KB
30 AC 24 ms 796 KB
31 TLE 1530 ms 976 KB
32 AC 21 ms 848 KB
33 AC 45 ms 808 KB
34 AC 44 ms 796 KB
35 TLE 1532 ms 924 KB
36 AC 22 ms 744 KB
37 AC 46 ms 800 KB
38 AC 44 ms 800 KB
39 TLE 1528 ms 1064 KB
4 AC 19 ms 916 KB
40 TLE 1530 ms 936 KB
41 TLE 1530 ms 944 KB
42 TLE 1530 ms 944 KB
43 TLE 1530 ms 940 KB
44 TLE 1530 ms 940 KB
45 TLE 1531 ms 944 KB
46 TLE 1531 ms 1072 KB
47 TLE 1530 ms 940 KB
48 TLE 1535 ms 936 KB
49 TLE 1528 ms 936 KB
5 TLE 1529 ms 1076 KB
6 AC 23 ms 796 KB
7 AC 22 ms 800 KB
8 AC 22 ms 796 KB
9 AC 22 ms 720 KB