Beispiel #1
0
    public void Solve()
    {
        int M = 63;

        int[] B = new int[M];
        for (int i = 0; i < M; i++)
        {
            B[i] = (int)((N >> i) & 1);
        }

        mlong[][] dp1 = new mlong[M][];
        mlong[][] dp2 = new mlong[M][];
        for (int i = 0; i < M; i++)
        {
            dp1[i] = new mlong[2];
            dp2[i] = new mlong[2];
        }

        dp1[0][0] = 1;
        dp2[0][0] = 1;

        for (int i = 0; i < M - 1; i++)
        {
            dp1[i + 1][0] += dp1[i][0];                 // (0, 0);
            dp1[i + 1][0] += dp1[i][0];                 // (1, 0);
            dp1[i + 1][1] += dp1[i][0];                 // (1, 1);
            dp1[i + 1][0] += dp1[i][1];                 // (0, 0);
            dp1[i + 1][1] += dp1[i][1];                 // (1, 0);
            dp1[i + 1][1] += dp1[i][1];                 // (1, 1);

            if (B[i] == 1)
            {
                dp2[i + 1][0] += dp1[i][0];                     // (0, 0);
                dp2[i + 1][1] += dp1[i][0];                     // (1, 1);
                dp2[i + 1][1] += dp1[i][1];                     // (1, 0);
            }

            if (B[i] == 1)
            {
                dp2[i + 1][0] += dp2[i][0];                     // (1, 0);
                dp2[i + 1][0] += dp2[i][1];                     // (0, 0);
                dp2[i + 1][1] += dp2[i][1];                     // (1, 1);
            }
            if (B[i] == 0)
            {
                dp2[i + 1][0] += dp2[i][0];                     // (0, 0);
                dp2[i + 1][1] += dp2[i][0];                     // (1, 1);
                dp2[i + 1][1] += dp2[i][1];                     // (1, 0);
            }
        }

        Console.WriteLine(dp2[M - 1][0]);
    }
Beispiel #2
0
    public override bool Equals(System.Object obj)
    {
        if (obj == null)
        {
            return(false);
        }
        mlong p = (mlong)obj;

        if ((System.Object)p == null)
        {
            return(false);
        }
        return(p.V == V);
    }
Beispiel #3
0
    public void Solve()
    {
        List <int> AA = new List <int>();

        AA.Add(A[0]);
        for (int i = 1; i < N; i++)
        {
            if (AA[AA.Count - 1] != A[i])
            {
                AA.Add(A[i]);
            }
        }
        A = AA.ToArray();
        N = A.Length;


        var di = new Dictionary <int, mlong>();

        for (int i = 0; i < N; i++)
        {
            if (!di.ContainsKey(A[i]))
            {
                di.Add(A[i], 0);
            }
        }
        var di2 = new Dictionary <int, mlong>();

        for (int i = 0; i < N; i++)
        {
            if (!di2.ContainsKey(A[i]))
            {
                di2.Add(A[i], 0);
            }
        }

        mlong[] dp = new mlong[N];
        dp[0]     = 1;
        di[A[0]]  = 1;
        di2[A[0]] = 1;
        for (int i = 1; i < N; i++)
        {
            dp[i] = dp[i - 1] + di[A[i - 1]] - di2[A[i - 1]];

            di[A[i]] += dp[i];
            di2[A[i]] = dp[i];
        }
        mlong ans = dp[N - 1] + di[A[N - 1]] - di2[A[N - 1]];

        Console.WriteLine(ans);
    }
Beispiel #4
0
    public static mlong ModPow(mlong a, long k)
    {
        if (k == 0)
        {
            return((mlong)1);
        }
        if (a == 0)
        {
            return((mlong)0);
        }
        mlong x   = a;
        mlong ret = 1;

        while (k > 0)
        {
            if (k % 2 == 1)
            {
                ret *= x;
            }
            x  *= x;
            k >>= 1;
        }
        return(ret);
    }