예제 #1
0
    static object Solve()
    {
        var s = Console.ReadLine().Select(c => (long)(c - '0')).ToArray();
        var t = Console.ReadLine().Select(c => (long)(c - '0')).ToArray();

        var n = s.Length;
        var m = t.Length;

        var rsq  = new StaticRSQ1(s);
        var tSum = t.Sum();

        var tr   = t.Reverse().ToArray();
        var conv = FFT.Convolution(s, tr);

        return(Enumerable.Range(0, n - m + 1).Min(XorSum));

        long XorSum(int j)
        {
            var r = tSum;

            r += rsq.GetSum(j, j + m);
            r -= 2 * conv[j + m - 1];
            return(r);
        }
    }
예제 #2
0
    static void Main()
    {
        var n = int.Parse(Console.ReadLine());
        var a = new long[n + 1];
        var b = new long[n + 1];

        for (int i = 1; i <= n; i++)
        {
            var v = Read();
            a[i] = v[0];
            b[i] = v[1];
        }

        var ab = FFT.Convolution(a, b);

        Console.WriteLine(string.Join("\n", ab[1..]));
예제 #3
0
    static void Main()
    {
        var h = Console.ReadLine().Split();

        char[] sa = h[0].ToCharArray(), sb = h[1].ToCharArray();

        var neg_a  = sa[0] == '-';
        var neg_b  = sb[0] == '-';
        var neg_ab = neg_a ^ neg_b;

        var a = Array.ConvertAll(sa, c => (long)(c - '0'));
        var b = Array.ConvertAll(sb, c => (long)(c - '0'));

        Array.Reverse(a);
        Array.Reverse(b);
        if (neg_a)
        {
            Array.Resize(ref a, a.Length - 1);
        }
        if (neg_b)
        {
            Array.Resize(ref b, b.Length - 1);
        }

        var ab = FFT.Convolution(a, b);

        for (int i = 0; i < ab.Length - 1; i++)
        {
            if (ab[i] < 10)
            {
                continue;
            }
            ab[i + 1] += ab[i] / 10;
            ab[i]     %= 10;
        }

        Console.WriteLine(ToString(ab, neg_ab));
    }
예제 #4
0
    static object Solve()
    {
        var n = int.Parse(Console.ReadLine());
        var a = ReadL();

        // g^{p-1} == 1
        var pg    = new long[p - 1];
        var pgMap = new long[p];

        pg[0] = 1;
        for (int i = 1; i < pg.Length; i++)
        {
            pg[i]        = pg[i - 1] * g % p;
            pgMap[pg[i]] = i;
        }

        var r = 0L;
        var c = new long[p - 1];

        foreach (var x in a)
        {
            if (x == 0)
            {
                continue;
            }
            c[pgMap[x]]++;
            r -= x * x % p;
        }
        var conv = FFT.Convolution(c, c);

        for (int i = 0; i < conv.Length; i++)
        {
            r += conv[i] * pg[i % (p - 1)];
        }
        return(r / 2);
    }