Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.53 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <limits>
  5. using namespace std;
  6.  
  7. const int MAXD = 1005, DIG = 9, BASE = 1000000000;
  8. const unsigned long long BOUND = numeric_limits <unsigned long long> :: max () - (unsigned long long) BASE * BASE;
  9.  
  10. struct bignum
  11. {
  12.     int D, digits [MAXD / DIG + 2];
  13.  
  14.     inline void trim ()
  15.     {
  16.         while (D > 1 && digits [D - 1] == 0)
  17.             D--;
  18.     }
  19.  
  20.     inline void init (long long x)
  21.     {
  22.         memset (digits, 0, sizeof (digits));
  23.         D = 0;
  24.  
  25.         do
  26.         {
  27.             digits [D++] = x % BASE;
  28.             x /= BASE;
  29.         }
  30.         while (x > 0);
  31.     }
  32.  
  33.     inline bignum (long long x)
  34.     {
  35.         init (x);
  36.     }
  37.  
  38.     inline bignum (int x = 0)
  39.     {
  40.         init (x);
  41.     }
  42.  
  43.     inline bignum (char *s)
  44.     {
  45.         memset (digits, 0, sizeof (digits));
  46.         int len = strlen (s), first = (len + DIG - 1) % DIG + 1;
  47.         D = (len + DIG - 1) / DIG;
  48.  
  49.         for (int i = 0; i < first; i++)
  50.             digits [D - 1] = digits [D - 1] * 10 + s [i] - '0';
  51.  
  52.         for (int i = first, d = D - 2; i < len; i += DIG, d--)
  53.             for (int j = i; j < i + DIG; j++)
  54.                 digits [d] = digits [d] * 10 + s [j] - '0';
  55.  
  56.         trim ();
  57.     }
  58.  
  59.     inline char *str ()
  60.     {
  61.         trim ();
  62.         char *buf = new char [DIG * D + 1];
  63.         int pos = 0, d = digits [D - 1];
  64.  
  65.         do
  66.         {
  67.             buf [pos++] = d % 10 + '0';
  68.             d /= 10;
  69.         }
  70.         while (d > 0);
  71.  
  72.         reverse (buf, buf + pos);
  73.  
  74.         for (int i = D - 2; i >= 0; i--, pos += DIG)
  75.             for (int j = DIG - 1, t = digits [i]; j >= 0; j--)
  76.             {
  77.                 buf [pos + j] = t % 10 + '0';
  78.                 t /= 10;
  79.             }
  80.  
  81.         buf [pos] = '\0';
  82.         return buf;
  83.     }
  84.  
  85.     inline bool operator < (const bignum &o) const
  86.     {
  87.         if (D != o.D)
  88.             return D < o.D;
  89.  
  90.         for (int i = D - 1; i >= 0; i--)
  91.             if (digits [i] != o.digits [i])
  92.                 return digits [i] < o.digits [i];
  93.  
  94.         return false;
  95.     }
  96.  
  97.     inline bool operator == (const bignum &o) const
  98.     {
  99.         if (D != o.D)
  100.             return false;
  101.  
  102.         for (int i = 0; i < D; i++)
  103.             if (digits [i] != o.digits [i])
  104.                 return false;
  105.  
  106.         return true;
  107.     }
  108.  
  109.     inline bignum operator << (int p) const
  110.     {
  111.         bignum temp;
  112.         temp.D = D + p;
  113.  
  114.         for (int i = 0; i < D; i++)
  115.             temp.digits [i + p] = digits [i];
  116.  
  117.         for (int i = 0; i < p; i++)
  118.             temp.digits [i] = 0;
  119.  
  120.         return temp;
  121.     }
  122.  
  123.     inline bignum operator >> (int p) const
  124.     {
  125.         bignum temp;
  126.         temp.D = D - p;
  127.  
  128.         for (int i = 0; i < D - p; i++)
  129.             temp.digits [i] = digits [i + p];
  130.  
  131.         for (int i = D - p; i < D; i++)
  132.             temp.digits [i] = 0;
  133.  
  134.         return temp;
  135.     }
  136.  
  137.     inline bignum range (int a, int b) const
  138.     {
  139.         bignum temp = 0;
  140.         temp.D = b - a;
  141.  
  142.         for (int i = 0; i < temp.D; i++)
  143.             temp.digits [i] = digits [i + a];
  144.  
  145.         return temp;
  146.     }
  147.  
  148.     inline bignum operator + (const bignum &o) const
  149.     {
  150.         bignum sum = o;
  151.         int carry = 0;
  152.  
  153.         for (sum.D = 0; sum.D < D || carry > 0; sum.D++)
  154.         {
  155.             sum.digits [sum.D] += (sum.D < D ? digits [sum.D] : 0) + carry;
  156.  
  157.             if (sum.digits [sum.D] >= BASE)
  158.             {
  159.                 sum.digits [sum.D] -= BASE;
  160.                 carry = 1;
  161.             }
  162.             else
  163.                 carry = 0;
  164.         }
  165.  
  166.         sum.D = max (sum.D, o.D);
  167.         sum.trim ();
  168.         return sum;
  169.     }
  170.  
  171.     inline bignum operator - (const bignum &o) const
  172.     {
  173.         bignum diff = *this;
  174.  
  175.         for (int i = 0, carry = 0; i < o.D || carry > 0; i++)
  176.         {
  177.             diff.digits [i] -= (i < o.D ? o.digits [i] : 0) + carry;
  178.  
  179.             if (diff.digits [i] < 0)
  180.             {
  181.                 diff.digits [i] += BASE;
  182.                 carry = 1;
  183.             }
  184.             else
  185.                 carry = 0;
  186.         }
  187.  
  188.         diff.trim ();
  189.         return diff;
  190.     }
  191.  
  192.     inline bignum operator * (const bignum &o) const
  193.     {
  194.         bignum prod = 0;
  195.         unsigned long long sum = 0, carry = 0;
  196.  
  197.         for (prod.D = 0; prod.D < D + o.D - 1 || carry > 0; prod.D++)
  198.         {
  199.             sum = carry % BASE;
  200.             carry /= BASE;
  201.  
  202.             for (int j = max (prod.D - o.D + 1, 0); j <= min (D - 1, prod.D); j++)
  203.             {
  204.                 sum += (unsigned long long) digits [j] * o.digits [prod.D - j];
  205.  
  206.                 if (sum >= BOUND)
  207.                 {
  208.                     carry += sum / BASE;
  209.                     sum %= BASE;
  210.                 }
  211.             }
  212.  
  213.             carry += sum / BASE;
  214.             prod.digits [prod.D] = sum % BASE;
  215.         }
  216.  
  217.         prod.trim ();
  218.         return prod;
  219.     }
  220.  
  221.     inline double double_div (const bignum &o) const
  222.     {
  223.         double val = 0, oval = 0;
  224.         int num = 0, onum = 0;
  225.  
  226.         for (int i = D - 1; i >= max (D - 3, 0); i--, num++)
  227.             val = val * BASE + digits [i];
  228.  
  229.         for (int i = o.D - 1; i >= max (o.D - 3, 0); i--, onum++)
  230.             oval = oval * BASE + o.digits [i];
  231.  
  232.         return val / oval * (D - num > o.D - onum ? BASE : 1);
  233.     }
  234.  
  235.     inline pair <bignum, bignum> divmod (const bignum &o) const
  236.     {
  237.         bignum quot = 0, rem = *this, temp;
  238.  
  239.         for (int i = D - o.D; i >= 0; i--)
  240.         {
  241.             temp = rem.range (i, rem.D);
  242.             int div = (int) temp.double_div (o);
  243.             bignum mult = o * div;
  244.  
  245.             while (div > 0 && temp < mult)
  246.             {
  247.                 mult = mult - o;
  248.                 div--;
  249.             }
  250.  
  251.             while (div + 1 < BASE && !(temp < mult + o))
  252.             {
  253.                 mult = mult + o;
  254.                 div++;
  255.             }
  256.  
  257.             rem = rem - (o * div << i);
  258.  
  259.             if (div > 0)
  260.             {
  261.                 quot.digits [i] = div;
  262.                 quot.D = max (quot.D, i + 1);
  263.             }
  264.         }
  265.  
  266.         quot.trim ();
  267.         rem.trim ();
  268.         return make_pair (quot, rem);
  269.     }
  270.  
  271.     inline bignum operator / (const bignum &o) const
  272.     {
  273.         return divmod (o).first;
  274.     }
  275.  
  276.     inline bignum operator % (const bignum &o) const
  277.     {
  278.         return divmod (o).second;
  279.     }
  280.  
  281.     inline bignum power (int exp) const
  282.     {
  283.         bignum p = 1, temp = *this;
  284.  
  285.         while (exp > 0)
  286.         {
  287.             if (exp & 1) p = p * temp;
  288.             if (exp > 1) temp = temp * temp;
  289.             exp >>= 1;
  290.         }
  291.  
  292.         return p;
  293.     }
  294. };
  295.  
  296. inline bignum gcd (bignum a, bignum b)
  297. {
  298.     bignum t;
  299.  
  300.     while (!(b == 0))
  301.     {
  302.         t = a % b;
  303.         a = b;
  304.         b = t;
  305.     }
  306.  
  307.     return a;
  308. }
  309.  
  310. const int MAXN = 1005;
  311.  
  312. int TC = 1, C, N;
  313. bignum events [MAXN];
  314. char str [MAXD];
  315.  
  316. int main ()
  317. {
  318.     for (scanf ("%d", &C); TC <= C; TC++)
  319.     {
  320.         scanf ("%d", &N);
  321.  
  322.         for (int i = 0; i < N; i++)
  323.         {
  324.             scanf ("%s", str);
  325.             events [i] = str;
  326.         }
  327.  
  328.         sort (events, events + N);
  329.         bignum last = events [0];
  330.  
  331.         for (int i = 0; i < N; i++)
  332.             events [i] = events [i] - last;
  333.  
  334.         bignum g = 0;
  335.  
  336.         for (int i = 0; i < N; i++)
  337.             g = gcd (g, events [i]);
  338.  
  339.         bignum sol = (g - last % g) % g;
  340.         printf ("Case #%d: %s\n", TC, sol.str ());
  341.     }
  342.  
  343.     return 0;
  344. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement