Пример #1
0
        public void Solve(TextReader input, TextWriter output)
        {
            var    scanner = new StreamTokenizer(input);
            int    testNum = scanner.NextInt();
            Random rnd     = new Random();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int      n = scanner.NextInt();
                double   d = scanner.NextDouble();
                double[] p = new double[n];
                int[]    v = new int[n];

                for (int i = 0; i < n; i++)
                {
                    p[i] = scanner.NextDouble();
                    v[i] = scanner.NextInt();
                }

                double left = 0, right = 1E12;
                while (right - left > 1E-8)
                {
                    double mid     = (left + right) / 2;
                    bool   success = true;
                    double bound   = -1E10;
                    for (int i = 0; i < n; i++)
                    {
                        if (v[i] > 0)
                        {
                            bound  = Math.Max(p[i] - mid, bound);
                            bound += d * v[i];
                            if (bound - d > p[i] + mid)
                            {
                                success = false;
                                break;
                            }
                        }
                    }
                    if (success)
                    {
                        right = mid;
                    }
                    else
                    {
                        left = mid;
                    }
                }

                output.WriteLine("Case #{0}: {1}", caseId, left);
            }
            output.Close();
        }
Пример #2
0
        public void Solve(TextReader input, TextWriter output)
        {
            var scanner = new StreamTokenizer(input);
            int testNum = scanner.NextInt();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int n      = scanner.NextInt();
                int k      = scanner.NextInt();
                int mask   = (1 << n) - 1;
                var answer = (k & mask) == mask;
                output.WriteLine("Case #{0}: {1}", caseId, answer ? "ON" : "OFF");
            }
            output.Close();
        }
Пример #3
0
        public void Solve(TextReader input, TextWriter output)
        {
            var scanner = new StreamTokenizer(input);
            int testNum = scanner.NextInt();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int n = scanner.NextInt();
                var t = Enumerable.Range(0, n).Select(i => BigInteger.Parse(scanner.Next())).ToArray();
                var m = t.Min();
                var d = t.Select(v => v - m).Where(v => v > 0).Aggregate(BigInteger.Zero, (s, v) => GCD(v, s));
                m %= d;
                output.WriteLine("Case #{0}: {1}", caseId, m > 0 ? d - m : 0);
            }
            output.Close();
        }
Пример #4
0
        public void Solve(TextReader input, TextWriter output)
        {
            var    scanner = new StreamTokenizer(input);
            int    testNum = scanner.NextInt();
            Random rnd     = new Random();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                long R      = scanner.NextLong();
                long k      = scanner.NextLong();
                int  n      = scanner.NextInt();
                var  g      = Enumerable.Range(0, n).Select(i => scanner.NextLong()).ToArray();
                var  d      = Enumerable.Repeat(-1, n).ToArray();
                var  s      = Enumerable.Repeat((long)0, n + 1).ToArray();
                long answer = 0;
                for (int i = 0, r = 0; r < R; r++)
                {
                    if (d[i] > -1)
                    {
                        int l = r - d[i];
                        answer += (R - r) / l * (s[r] - s[d[i]]);
                        answer += s[(R - r) % l + d[i]] - s[d[i]];
                        break;
                    }
                    d[i] = r;
                    long c = 0;
                    int  j = i;
                    while (c + g[i] <= k)
                    {
                        c += g[i];
                        i++;
                        if (i == n)
                        {
                            i = 0;
                        }
                        if (i == j)
                        {
                            break;
                        }
                    }
                    answer  += c;
                    s[r + 1] = answer;
                }
                output.WriteLine("Case #{0}: {1}", caseId, answer);
            }
            output.Close();
        }
Пример #5
0
        public void Solve(TextReader input, TextWriter output)
        {
            var    scanner = new StreamTokenizer(input);
            int    testNum = scanner.NextInt();
            Random rnd     = new Random();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int n      = scanner.NextInt();
                int k      = scanner.NextInt();
                int b      = scanner.NextInt();
                int t      = scanner.NextInt();
                var x      = Enumerable.Range(0, n).Select(i => scanner.NextInt()).ToArray();
                var v      = Enumerable.Range(0, n).Select(i => scanner.NextInt()).ToArray();
                int answer = 0;
                for (int i = n - 1, j = n - 1; i >= 0 && k > 0; i--)
                {
                    if (x[i] + v[i] * t >= b)
                    {
                        k--;
                        answer += j - i;
                        j--;
                    }
                }
                if (k > 0)
                {
                    output.WriteLine("Case #{0}: {1}", caseId, "IMPOSSIBLE");
                }
                else
                {
                    output.WriteLine("Case #{0}: {1}", caseId, answer);
                }
            }
            output.Close();
        }
Пример #6
0
        public void Solve(TextReader input, TextWriter output)
        {
            var    scanner = new StreamTokenizer(input);
            int    testNum = scanner.NextInt();
            Random rnd     = new Random();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int n = scanner.NextInt();
                var f = new long[n + 1, n + 1];
                var c = new long[n + 1, n + 1];
                for (int i = 0; i <= n; i++)
                {
                    c[i, 0] = 1;
                    c[i, i] = 1;
                    for (int j = 1; j < i; j++)
                    {
                        c[i, j] = (c[i - 1, j] + c[i - 1, j - 1]) % Modulus;
                    }
                }

                for (int i = 2; i <= n; i++)
                {
                    f[i, 1] = 1;
                    for (int j = 2; j < i; j++)
                    {
                        f[i, j] = 0;
                        for (int k = 1; k < j; k++)
                        {
                            f[i, j] += (f[j, k] * c[i - j - 1, j - k - 1]) % Modulus;
                        }
                        f[i, j] %= Modulus;
                    }
                }
                long answer = 0;
                for (int j = 1; j < n; j++)
                {
                    answer += f[n, j];
                }
                answer %= Modulus;
                output.WriteLine("Case #{0}: {1}", caseId, answer % Modulus);
            }
            output.Close();
        }
Пример #7
0
        public void Solve(TextReader input, TextWriter output)
        {
            var    scanner = new StreamTokenizer(input);
            int    testNum = scanner.NextInt();
            Random rnd     = new Random();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int n = scanner.NextInt();
                var f = new long[1 << (n + 1), n + 1];
                for (int i = 0; i < (1 << n); i++)
                {
                    int m = scanner.NextInt();
                    for (int j = 0; j <= n; j++)
                    {
                        f[i, j] = (j < n - m) ? Inf : 0;
                    }
                }
                int offset    = 1 << n;
                int offsetOld = 0;
                for (int i = n - 1; i >= 0; i--)
                {
                    for (int j = 0; j < (1 << i); j++)
                    {
                        int p = scanner.NextInt();
                        for (int k = 0; k <= n - 1; k++)
                        {
                            f[offset + j, k] = Math.Min(f[offsetOld + j * 2, k + 1] + f[offsetOld + j * 2 + 1, k + 1] + p,
                                                        f[offsetOld + j * 2, k] + f[offsetOld + j * 2 + 1, k]);
                        }
                    }
                    offset    += 1 << i;
                    offsetOld += 1 << (i + 1);
                }

                output.WriteLine("Case #{0}: {1}", caseId, f[offsetOld, 0]);
            }
            output.Close();
        }
Пример #8
0
        public void Solve(TextReader input, TextWriter output)
        {
            var scanner = new StreamTokenizer(input);
            int testNum = scanner.NextInt();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int n = scanner.NextInt();
                int m = scanner.NextInt();
                var s = new HashSet <string>();
                s.Add("");
                for (int i = 0; i < n; i++)
                {
                    AddPath(s, scanner.Next());
                }
                int answer = 0;
                for (int i = 0; i < m; i++)
                {
                    answer += AddPath(s, scanner.Next());
                }
                output.WriteLine("Case #{0}: {1}", caseId, answer);
            }
            output.Close();
        }
Пример #9
0
        public void Solve(TextReader input, TextWriter output)
        {
            var scanner = new StreamTokenizer(input);
            int testNum = scanner.NextInt();

            bool[] isPrime = new bool [R + 1];
            for (int i = 2; i <= R; i++)
            {
                isPrime[i] = true;
            }
            for (long i = 0; i <= R; i++)
            {
                if (isPrime[i])
                {
                    for (long j = i * i; j <= R; j += i)
                    {
                        isPrime[j] = false;
                    }
                }
            }

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                long n = scanner.NextLong();
                if (n == 1)
                {
                    output.WriteLine("Case #{0}: {1}", caseId, 0);
                }
                else
                {
                    int answer = 1;
                    for (long p = 2; p *p <= n; p++)
                    {
                        if (isPrime[p])
                        {
                            long s = p * p;
                            while (s <= n)
                            {
                                s *= p;
                                answer++;
                            }
                        }
                    }
                    output.WriteLine("Case #{0}: {1}", caseId, answer);
                }
            }
            output.Close();
        }
Пример #10
0
        public void Solve(TextReader input, TextWriter output)
        {
            var scanner = new StreamTokenizer(input);
            int testNum = scanner.NextInt();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int                x = scanner.NextInt();
                int                s = scanner.NextInt();
                int                r = scanner.NextInt();
                double             t = scanner.NextInt();
                int                n = scanner.NextInt();
                Tuple <int, int>[] a = new Tuple <int, int> [n + 1];
                for (int i = 0; i < n; i++)
                {
                    int b = scanner.NextInt();
                    int e = scanner.NextInt();
                    int w = scanner.NextInt();
                    x   -= e - b;
                    a[i] = Tuple.Create(s + w, e - b);
                }
                a[n] = Tuple.Create(s, x);
                int    d      = r - s;
                double answer = 0;
                foreach (var p in a.OrderBy(p => p.Item1))
                {
                    double l  = p.Item2;
                    double v  = p.Item1;
                    double ct = Math.Min(l / (d + v), t);
                    answer += l / v - d / v * ct;
                    t      -= ct;
                }
                output.WriteLine("Case #{0}: {1:F10}", caseId, answer);
            }
            output.Close();
        }
Пример #11
0
        public void Solve(TextReader input, TextWriter output)
        {
            var    scanner = new StreamTokenizer(input);
            int    testNum = scanner.NextInt();
            Random rnd     = new Random();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int n      = scanner.NextInt();
                var x1     = new int[n];
                var y1     = new int[n];
                var x2     = new int[n];
                var y2     = new int[n];
                var parent = Enumerable.Repeat(-1, n).ToArray();
                var map    = new int[101, 101];
                for (int i = 0; i < n; i++)
                {
                    x1[i] = scanner.NextInt();
                    y1[i] = scanner.NextInt();
                    x2[i] = scanner.NextInt();
                    y2[i] = scanner.NextInt();
                    for (int x = x1[i]; x <= x2[i]; x++)
                    {
                        for (int y = y1[i]; y <= y2[i]; y++)
                        {
                            map[x, y] = 1;
                        }
                    }
                }
                int answer = 0;
                while (true)
                {
                    int cnt = 0;
                    for (int x = 100; x > 0; x--)
                    {
                        for (int y = 100; y > 0; y--)
                        {
                            if (map[x, y] == 1)
                            {
                                cnt++;
                            }
                        }
                    }
                    if (cnt == 0)
                    {
                        break;
                    }
                    for (int x = 100; x > 0; x--)
                    {
                        for (int y = 100; y > 0; y--)
                        {
                            if (map[x, y] == 0 && map[x, y - 1] == 1 && map[x - 1, y] == 1)
                            {
                                map[x, y] = 1;
                            }
                            else if (map[x, y] == 1 && map[x, y - 1] == 0 && map[x - 1, y] == 0)
                            {
                                map[x, y] = 0;
                            }
                        }
                    }
                    answer++;
                }

                /*
                 * for (int i = 0; i < n; i++)
                 *  for (int j = i + 1; j < n; j++)
                 * {
                 *  int t = Inter(x1[i], x2[i], x1[j], x2[j]);
                 *  int t2 = Inter(y1[i], y2[i], y1[j], y2[j]);
                 *  if ((t > 0 && t2 > 0)
                 || (t > 0 && t2 == 0)
                 || (t2 > 0 && t == 0))
                 || {
                 ||     Merge(i, j);
                 || }
                 ||}
                 ||
                 ||
                 ||
                 ||for (int j = 1; j < n; j++)
                 || answer += f[n, j];
                 ||answer %= Modulus;
                 */
                output.WriteLine("Case #{0}: {1}", caseId, answer);
            }
            output.Close();
        }
Пример #12
0
        public void Solve(TextReader input, TextWriter output)
        {
            var scanner = new StreamTokenizer(input);
            int testNum = scanner.NextInt();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int r = scanner.NextInt();
                int c = scanner.NextInt();
                int d = scanner.NextInt();

                int[,] w  = new int[r + 1, c + 1];
                int[,] xw = new int[r + 1, c + 1];
                int[,] yw = new int[r + 1, c + 1];
                int[,] sw = new int[r + 1, c + 1];
                int[,] sx = new int[r + 1, c + 1];
                int[,] sy = new int[r + 1, c + 1];

                for (int i = 0; i < r; i++)
                {
                    string s = scanner.Next();
                    for (int j = 0; j < c; j++)
                    {
                        w[i + 1, j + 1]  = s[j] - '0';
                        sw[i + 1, j + 1] = w[i + 1, j + 1];
                        xw[i + 1, j + 1] = w[i + 1, j + 1] * (i + 1);
                        yw[i + 1, j + 1] = w[i + 1, j + 1] * (j + 1);
                        sx[i + 1, j + 1] = xw[i + 1, j + 1];
                        sy[i + 1, j + 1] = yw[i + 1, j + 1];
                    }
                }
                for (int i = 0; i < r; i++)
                {
                    for (int j = 0; j < c; j++)
                    {
                        sw[i + 1, j + 1] += sw[i + 1, j] + sw[i, j + 1] - sw[i, j];
                        sx[i + 1, j + 1] += sx[i + 1, j] + sx[i, j + 1] - sx[i, j];
                        sy[i + 1, j + 1] += sy[i + 1, j] + sy[i, j + 1] - sy[i, j];
                    }
                }

                int answer = -1;
                for (int i = 0; i < r; i++)
                {
                    for (int j = 0; j < c; j++)
                    {
                        for (int k = 3; k <= Math.Min(r - i, c - j); k++)
                        {
                            int tx = getShape(xw, sx, i + 1, j + 1, i + k, j + k);
                            int ty = getShape(yw, sy, i + 1, j + 1, i + k, j + k);
                            int tw = getShape(w, sw, i + 1, j + 1, i + k, j + k);
                            if (2 * tx == tw * (2 * i + 1 + k) && 2 * ty == tw * (2 * j + 1 + k))
                            {
                                answer = Math.Max(answer, k);
                            }
                        }
                    }
                }

                if (answer == -1)
                {
                    output.WriteLine("Case #{0}: IMPOSSIBLE", caseId);
                }
                else
                {
                    output.WriteLine("Case #{0}: {1}", caseId, answer);
                }
            }
            output.Close();
        }
Пример #13
0
        public void Solve(TextReader input, TextWriter output)
        {
            var scanner = new StreamTokenizer(input);
            int testNum = scanner.NextInt();

            foreach (int caseId in Enumerable.Range(1, testNum))
            {
                int      n     = scanner.NextInt();
                string[] match = new string[n];
                int[]    win   = new int[n];
                int[]    total = new int[n];
                double[] wp    = new double[n];
                double[] owp   = new double[n];
                double[] oowp  = new double[n];
                double[] rpi   = new double[n];
                for (int i = 0; i < n; i++)
                {
                    match[i] = scanner.Next();
                    win[i]   = match[i].Count(c => c == '1');
                    total[i] = match[i].Count(c => c != '.');
                    wp[i]    = (double)win[i] / total[i];
                }
                for (int i = 0; i < n; i++)
                {
                    double sum = 0;
                    for (int j = 0; j < n; j++)
                    {
                        if (match[i][j] != '.')
                        {
                            if (match[j][i] == '1')
                            {
                                sum += (double)(win[j] - 1) / (total[j] - 1);
                            }
                            else
                            {
                                sum += (double)win[j] / (total[j] - 1);
                            }
                        }
                    }
                    owp[i] = sum / total[i];
                }
                for (int i = 0; i < n; i++)
                {
                    double sum = 0;
                    for (int j = 0; j < n; j++)
                    {
                        if (match[i][j] != '.')
                        {
                            sum += owp[j];
                        }
                    }
                    oowp[i] = sum / total[i];
                }
                output.WriteLine("Case #{0}:", caseId);
                for (int i = 0; i < n; i++)
                {
                    rpi[i] = 0.25 * wp[i] + 0.5 * owp[i] + 0.25 * oowp[i];
                    output.WriteLine("{0}", rpi[i]);
                }
            }
            output.Close();
        }