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]); }
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); }
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); }
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); }