예제 #1
0
        //[SolutionMethod]
        public BeautifulQuadruplesAnswer Straight(BeautifulQuadruplesSample sample)
        {
            Array.Sort(sample.arr);
            Int32 a = sample.arr[0];
            Int32 b = sample.arr[1];
            Int32 c = sample.arr[2];
            Int32 d = sample.arr[3];

            Int32 res = 0;


            for (Int32 ia = 1; ia <= a; ia++)
            {
                for (Int32 ib = ia; ib <= b; ib++)
                {
                    for (Int32 ic = ib; ic <= c; ic++)
                    {
                        for (Int32 id = ic; id <= d; id++)
                        {
                            Int32 X = ((id ^ ic) ^ ib) ^ ia;
                            if (X != 0)
                            {
                                res++;
                            }
                        }
                    }
                }
            }


            return(new BeautifulQuadruplesAnswer()
            {
                result = res
            });
        }
예제 #2
0
        static void sampleInfo(BeautifulQuadruplesSample sample)
        {
            Array.Sort(sample.arr);
            Int32 a = sample.arr[0];
            Int32 b = sample.arr[1];

            Int32 c = sample.arr[2];
            Int32 d = sample.arr[3];

            Int32 res     = 0;
            Int32 doubles = 0;
            Int32 uniques = 0;
            Int32 Zeroes1 = 0;
            Int32 Zeroes2 = 0;
            Int32 Zeroes  = 0;


            for (int ia = 1; ia <= a; ia++)
            {
                for (int ib = 1; ib <= b; ib++)
                {
                    for (int ic = 1; ic <= c; ic++)
                    {
                        for (int id = 1; id <= d; id++)
                        {
                            if ((id < ic) || (id < ib) || (id < ia) || (ic < ib) || (ic < ia) || (ib < ia))
                            {
                                doubles++;
                                continue;
                            }
                            uniques++;
                            Int32 X = ia ^ ib;
                            X = X ^ ic;
                            X = X ^ id;
                            if (X == 0)
                            {
                                Zeroes++;
                                Zeroes1++;
                                if (ia != ib && ia != ic)
                                {
                                    Zeroes2++;
                                }
                                Console.WriteLine($"{ia}^{ib}^{ic}^{id} == 0");
                            }
                            else
                            {
                                res++;
                            }
                        }
                    }
                }
            }
            Console.WriteLine($"Total combs {a * b * c * d} Uniques {uniques} Doubles {doubles} Right answer {res } Total Zeroes {Zeroes} Zeroes2 {Zeroes2}");
        }
예제 #3
0
        //[SolutionMethod]
        public TAnswer DP3(TSample Sample)
        {
            BeautifulQuadruplesSample sample = Sample as BeautifulQuadruplesSample;

            Array.Sort(sample.arr);
            Int32 a = sample.arr[0];
            Int32 b = sample.arr[1];

            Int32 c = sample.arr[2];
            Int32 d = sample.arr[3];

            Int32 MaxXor = (1 << (int)(Math.Log(d, 2) + 1)) - 1;

            Int32[,] cnt = new Int32[MaxXor + 1, MaxXor + 1];

            Int32[] tot = new Int32[MaxXor + 1];
            Int32   ans = 0;

            for (int i = 1; i <= a; ++i)
            {
                for (int j = i; j <= b; ++j)
                {
                    ++cnt[i ^ j, j];
                    ++tot[j];
                }
            }

            for (int i = 0; i < MaxXor; ++i)
            {
                for (int j = 1; j < MaxXor; ++j)
                {
                    cnt[i, j] += cnt[i, j - 1];
                }
                if (i > 0)
                {
                    tot[i] += tot[i - 1];
                }
            }

            for (int i = 1; i <= c; ++i)
            {
                for (int j = i; j <= d; ++j)
                {
                    ans += tot[i] - cnt[i ^ j, i];
                }
            }
            return(new BeautifulQuadruplesAnswer()
            {
                result = ans
            });
        }
예제 #4
0
        public TAnswer DP2(TSample Sample)
        {
            BeautifulQuadruplesSample sample = Sample as BeautifulQuadruplesSample;

            //sampleInfo(sample);
            Array.Sort(sample.arr);
            Int32 a = sample.arr[0];
            Int32 b = sample.arr[1];

            Int32 c = sample.arr[2];
            Int32 d = sample.arr[3];

            Int64[] F = new Int64[d + 1];

            F[0] = 0;
            for (int i = 1; i <= d; i++)
            {
                F[i] = F[i - 1] + i;
            }

            Int64[,] SB = new Int64[b + 1, 2];
            SB[1, 0]    = d * c - F[c - 1];
            SB[1, 1]    = SB[1, 0];
            for (int i = 2; i <= b; i++)
            {
                SB[i, 0] = d * c - F[c - 1] - (d * (i - 1) - F[i - 2]);
                SB[i, 1] = SB[i - 1, 1] + SB[i, 0];
            }


            Int64[,] SA = new Int64[a + 1, 2];

            SA[1, 0] = SB[b, 1];
            SA[1, 1] = SB[b, 1];

            for (int i = 2; i <= a; i++)
            {
                SA[i, 0] = SA[i - 1, 0] - SB[i - 1, 0];
                SA[i, 1] = SA[i - 1, 1] + SA[i, 0];
            }

            Int64 Nulls = a * c - F[a - 1];



            Int64 result = SA[a, 1] - Nulls;

            Int32 MaxXor = (1 << (int)(Math.Log(d, 2) + 1)) - 1;


            Int32[,] counts1 = new Int32[MaxXor + 1, b + 1];
            for (int i = 1; i <= a; i++)
            {
                for (int j = i + 1; j <= b; j++)
                {
                    counts1[i ^ j, j]++;
                }
            }



            Int32[,] counts2 = new Int32[MaxXor + 1, c + 1];

            for (int i = 1; i <= c; i++)
            {
                for (int j = i + 1; j <= d; j++)
                {
                    counts2[i ^ j, i]++;
                }
            }

            for (int i = 1; i <= MaxXor; i++)
            {
                for (int j = c; j >= 1; j--)
                {
                    counts2[i, j - 1] += counts2[i, j];
                }
            }


            for (int i = 1; i <= MaxXor; i++)
            {
                for (int j = 1; j <= b; j++)
                {
                    result -= counts2[i, j] * counts1[i, j];
                }
            }


            return(new BeautifulQuadruplesAnswer()
            {
                result = result
            });
        }
예제 #5
0
        //[SolutionMethod]
        public BeautifulQuadruplesAnswer DP(BeautifulQuadruplesSample sample)
        {
            Array.Sort(sample.arr);
            Int32 a = sample.arr[0];
            Int32 b = sample.arr[1];

            Int32 c = sample.arr[2];
            Int32 d = sample.arr[3];

            Int32[] RP = new Int32[d + 1];
            RP[0] = 0;
            RP[1] = 0;
            RP[2] = 1;
            for (int i = 3; i < d + 1; i++)
            {
                RP[i] = RP[i - 1] + i - 1;
            }

            /*
             * Int32 MaxXor = (1 << (int)(Math.Log(d, 2) + 1)) - 1;
             *
             * Int32[,] dp = new Int32[4, MaxXor];
             *
             *
             * Int32 NP = a * c + a * b;
             * Int32 TotalCombinations = a * b * c * d;
             * //Int32 doubles = a * ((b - a) * (d - c));
             * Int32 doubles = 0;
             * for (int ia = 1; ia <= a; ia++)
             * {
             *  for (int ib = ia; ib <= b; ib++)
             *  {
             *      for (int ic = ib; ic <= c; ic++)
             *      {
             *          for (int id = ic; id <= d; id++)
             *          {
             *              doubles++;
             *          }
             *      }
             *  }
             * }
             */


            //Int32[] ar = Enumerable.Range(1, a).Concat(Enumerable.Range(1, b)).Concat(Enumerable.Range(1, c)).Concat(Enumerable.Range(1, d)).ToArray();
            Int32[] ar     = Enumerable.Range(1, d).ToArray();
            Int32   MaxXor = (1 << (int)(Math.Log(d, 2) + 1)) - 1;

            Int32[] counts = new Int32[d + 1];
            foreach (var val in ar)
            {
                counts[val]++;
            }
            ar = ar.Distinct().ToArray();



            Int32 n = ar.Length;



            Int64[,] dp = new Int64[n + 1, MaxXor + 1];

            dp[0, 0] = 1;


            for (Int32 i = 1; i <= n; i++)
            {
                for (int j = 0; j <= MaxXor; j++)
                {
                    dp[i, j] =
                        (((dp[i - 1, j] * (1 + counts[ar[i - 1]] / 2)))
                         +
                         ((dp[i - 1, j ^ ar[i - 1]] * ((counts[ar[i - 1]] + 1) / 2))))
                    ;
                }
            }


            Int32 res = 0;

            Int32 doubles = 0;

            for (int ia = 1; ia <= a; ia++)
            {
                for (int ib = 1; ib <= b; ib++)
                {
                    for (int ic = 1; ic <= c; ic++)
                    {
                        for (int id = 1; id <= d; id++)
                        {
                            if ((id < ic) || (id < ib) || (id < ia) || (ic < ib) || (ic < ia) || (ib < ia))
                            {
                                doubles++;
                                continue;
                            }
                            Int32 X = ia ^ ib;
                            X = X ^ ic;
                            X = X ^ id;
                            if (X == 0)
                            {
                                Console.WriteLine($"{ia}^{ib}^{ic}^{id} == 0");
                            }
                            else
                            {
                                res++;
                            }
                        }
                    }
                }
            }


            Int32 bBccBd = 0;

            for (int x = 1; x <= b - 2; x++)
            {
                for (int z = 3; z <= b; z++)
                {
                    for (int y = x + 1; y < z; y++)
                    {
                        Console.WriteLine($"{z} {y} {x}");
                        bBccBd++;
                    }
                }
            }

            Int32 uniques  = 0;
            Int32 uniques1 = 0;

            for (int ia = 1; ia <= a; ia++)
            {
                for (int ib = ia; ib <= b; ib++)
                {
                    for (int ic = ib; ic <= c; ic++)
                    {
                        uniques1 += d - ic + 1;
                    }
                }
            }

            Int32[] FB   = new Int32[d + 1];
            Int32[] FBFB = new Int32[d + 1];
            FB[0]   = 0;
            FBFB[0] = 0;
            for (int i = 1; i <= d; i++)
            {
                FB[i]   = FB[i - 1] + i;
                FBFB[i] = FBFB[i - 1] + FB[i];
            }



            Int32[] sc = new Int32[c + 1];
            sc[0] = 0;
            for (int ic = 1; ic <= c; ic++)
            {
                sc[ic] = ic * d - FB[ic] + ic;
            }

            Int32[] sb = new Int32[b + 1];
            sb[0] = sc[c];
            for (int ib = 1; ib <= b; ib++)
            {
                sb[ib] = sb[ib - 1] - ib + sc[b] + 1;
            }



            for (int ia = 1; ia <= a; ia++)
            {
                for (int ib = ia; ib <= b; ib++)
                {
                    uniques += 123;
                }
            }


            Int32[,] fbdp = new Int32[d + 1, d + 1];
            for (int i = 0; i <= d; i++)
            {
                for (int j = i; j <= d; j++)
                {
                    fbdp[i, j] = FB[j] - FB[i];
                }
            }



            Console.WriteLine($"{uniques} {uniques1}");
            Int32 NP = a * c + a * b;

            res = uniques1 - NP;

            //Console.WriteLine(bBccBd);
            //doubles = RP[a] * 3 + RP[b] * 2 + RP[c];


            //res = TotalCombinations - doubles - NP;

            return(new BeautifulQuadruplesAnswer()
            {
                result = res
            });
        }