示例#1
0
        public void Solve()
        {
            var n = sc.Integer();
            var s = sc.Scan();

            var dp   = new ModInteger[n + 1];
            var next = new ModInteger[n + 1];

            dp[0] = 1;
            for (int _ = 0; _ < n; _++)
            {
                for (int i = 0; i < n; i++)
                {
                    next[i + 1] += dp[i];
                    next[i + 1] += dp[i];
                    next[Math.Max(0, i - 1)] += dp[i];
                }
                for (int i = 0; i <= n; i++)
                {
                    dp[i]   = next[i];
                    next[i] = 0;
                }
            }
            var res = dp[s.Length];
            var k   = ModInteger.Pow(2, s.Length);

            res *= ModInteger.Pow(k, ModInteger.Mod - 2);
            IO.Printer.Out.WriteLine(res);
        }
示例#2
0
        public void Solve()
        {
            var n = sc.Integer();
            var s = sc.Scan();
            //const int MOD = (int)ModInteger.Mod;
            var dp = new ModInteger[n + 1];

            dp[0] = 1;
            for (int _ = 0; _ < n; _++)
            {
                var next = new ModInteger[n + 1];
                for (int i = 0; i < n; i++)
                {
                    next[i + 1] += dp[i];
                    //if (next[i + 1] >= MOD) next[i + 1] -= MOD;
                    next[i + 1] += dp[i];
                    //if (next[i + 1] >= MOD) next[i + 1] -= MOD;
                    var p = Math.Max(0, i - 1);
                    next[p] += dp[i];
                    //if (next[p] >= MOD) next[p] -= MOD;
                }
                dp = next;
            }
            ModInteger res = dp[s.Length];
            var        k   = ModInteger.Pow(2, s.Length);

            res *= ModInteger.Pow(k, ModInteger.Mod - 2);
            IO.Printer.Out.WriteLine(res);
        }
示例#3
0
        public void Solve()
        {
            var a = sc.Long();
            var b = sc.Long();

            ModInteger.Mod = sc.Integer();
            var mat = new ModMatrix(2, 2);

            mat[0, 0] = 10;
            mat[0, 1] = 1;
            mat[1, 1] = 1;
            var vec = new ModMatrix(2, 1);

            vec[0, 0] = 1;
            vec[0, 1] = 1;

            var gcd = MathEx.GCD(a, b);
            var A   = (ModMatrix.Pow(mat, a - 1) * vec)[0, 0];

            mat[0, 0] = ModInteger.Pow(10, gcd);

            var B = (ModMatrix.Pow(mat, b / gcd - 1) * vec)[0, 0];

            IO.Printer.Out.WriteLine(A * B);
            //IO.Printer.Out.WriteLine(A * B * ModInteger.Inverse(GCD));
        }
示例#4
0
文件: 696598.cs 项目: qifanyyy/CLCDSA
        public void Solve()
        {
            var n = sc.Integer();
            var A = sc.Long();
            var B = sc.Long();
            var a = new BigInteger[n];

            for (int i = 0; i < n; i++)
            {
                a[i] = sc.Long();
            }
            Array.Sort(a);
            if (A == 1)
            {
                for (int i = 0; i < n; i++)
                {
                    IO.Printer.Out.WriteLine(a[i]);
                }
                return;
            }
            while (B > 0)
            {
                if (a[n - 1] < a[0] * A)
                {
                    break;
                }
                a[0] *= A;
                Array.Sort(a);
                Debug.WriteLine(a.AsJoinedString());
                B--;
            }
            Debug.WriteLine(B);
            var k   = B / n;
            var rem = B % n;

            while (rem > 0)
            {
                a[0] *= A;
                Array.Sort(a);
                rem--;
            }
            for (int i = 0; i < n; i++)
            {
                var v = a[i] % 1000000007;
                v = (v * ModInteger.Pow(A, k).num) % 1000000007;
                IO.Printer.Out.WriteLine(v);
            }
        }
示例#5
0
文件: 839119.cs 项目: qifanyyy/CLCDSA
        public void Solve()
        {
            var        n    = sc.Integer();
            var        s    = sc.Scan();
            const long MOD  = ModInteger.Mod;
            var        dp   = new long[n + 1];
            var        next = new long[n + 1];

            dp[0] = 1;
            for (int _ = 0; _ < n; _++)
            {
                for (int i = 0; i < n; i++)
                {
                    next[i + 1] += dp[i];
                    if (next[i + 1] >= MOD)
                    {
                        next[i + 1] -= MOD;
                    }
                    next[i + 1] += dp[i];
                    if (next[i + 1] >= MOD)
                    {
                        next[i + 1] -= MOD;
                    }
                    var p = Math.Max(0, i - 1);
                    next[p] += dp[i];
                    if (next[p] >= MOD)
                    {
                        next[p] -= MOD;
                    }
                }
                for (int i = 0; i <= n; i++)
                {
                    dp[i]   = next[i];
                    next[i] = 0;
                }
            }
            ModInteger res = dp[s.Length];
            var        k   = ModInteger.Pow(2, s.Length);

            res *= ModInteger.Pow(k, ModInteger.Mod - 2);
            IO.Printer.Out.WriteLine(res);
        }
示例#6
0
        public void Solve()
        {
            var n     = sc.Integer();
            var m     = sc.Integer();
            var k     = sc.Integer();
            var table = new ModTable(n + m + k + 1);

            ModInteger ans = 0;
            ModInteger C   = 1;
            var        l   = 0;
            var        r   = 0;

            for (int i = n; i <= n + m + k; i++)
            {
                var a = table.Combination(i - 1, n - 1);
                a   *= ModInteger.Pow(3, n + m + k - i);
                a   *= C;
                ans += a;
                C   *= 2;
                var rem = i - n + 1;
                Debug.WriteLine("{0} {1}", l, r);
                var nl = Math.Max(0, rem - k);
                var nr = Math.Min(m, rem);
                if (l != nl)
                {
                    C -= table.Combination(i - n, l);
                }
                if (r == nr)
                {
                    C -= table.Combination(i - n, r);
                }
                else if (r > nr)
                {
                    C -= table.Combination(i - n, r) * 2;
                }
                l = nl;
                r = nr;
            }
            IO.Printer.Out.WriteLine(ans);
        }
示例#7
0
        public void Solve()
        {
            var        n   = sc.Integer();
            var        k   = sc.Integer();
            ModInteger ans = 0;
            var        div = MathEx.GetDivisors(n);
            var        dp  = new ModInteger[div.Count];

            for (int i = 0; i < div.Count; i++)
            {
                if (n % 2 == 0)
                {
                    dp[i] += ModInteger.Pow(k, div[i]);
                }
                else
                {
                    dp[i] += ModInteger.Pow(k, div[i] / 2 + 1);
                }
                for (int j = 0; j < i; j++)
                {
                    if (div[i] % div[j] == 0)
                    {
                        dp[i] -= dp[j];
                    }
                }
                if (n % 2 == 0 && (n / div[i]) % 2 == 0)
                {
                    ans += dp[i] * div[i];
                }
                if (n % 2 == 1)
                {
                    ans += dp[i] * div[i];
                }
            }
            Debug.WriteLine(dp.AsJoinedString());
            //naive(n, k);
            IO.Printer.Out.WriteLine(ans);
        }
示例#8
0
        public void Solve()
        {
            var n = sc.Integer();
            var l = sc.Long(n).Distinct().ToArray();

            Array.Sort(l);
            var ans = ModInteger.Pow(2, l[0]);
            var gcd = 0L;

            foreach (var x in l.Skip(1).Select(x => x - l[0]))
            {
                if (gcd == 0)
                {
                    gcd = x;
                }
                else
                {
                    gcd = MathEx.GCD(gcd, x);
                }
            }
            ans *= ModInteger.Pow(2, (gcd + 1) / 2);
            IO.Printer.Out.WriteLine(ans);
        }
示例#9
0
 public static ModInteger operator ^(ModInteger l, long r)
 {
     return(ModInteger.Pow(l, r));
 }