about summary refs log tree commit diff
path: root/others/volume1
diff options
context:
space:
mode:
authorRaphael McSinyx <vn.mcsinyx@gmail.com>2017-02-21 21:09:39 +0700
committerRaphael McSinyx <vn.mcsinyx@gmail.com>2017-02-21 21:09:39 +0700
commit7d19f480637e9e880b98dabfbcf8e885b0a2d3b9 (patch)
treefa52914a2e58bc13570839fa297be05b7b7616bf /others/volume1
parentf2d4bc6b7c302dee2d84a3acf84b83b5a98c45fa (diff)
downloadcp-7d19f480637e9e880b98dabfbcf8e885b0a2d3b9.tar.gz
Update others/volume1
Diffstat (limited to 'others/volume1')
-rw-r--r--others/volume1/001.scm3
-rw-r--r--others/volume1/077.pas59
-rw-r--r--others/volume1/078.pas60
-rw-r--r--others/volume1/080.pas17
-rw-r--r--others/volume1/081.pas30
-rw-r--r--others/volume1/082.pas20
-rw-r--r--others/volume1/086.scm7
-rw-r--r--others/volume1/092.pas10
-rw-r--r--others/volume1/095.pas11
-rw-r--r--others/volume1/096.pas34
-rw-r--r--others/volume1/112.pas39
-rw-r--r--others/volume1/113.pas28
-rw-r--r--others/volume1/clib.pas32
13 files changed, 347 insertions, 3 deletions
diff --git a/others/volume1/001.scm b/others/volume1/001.scm
index 4e6573b..93f3f89 100644
--- a/others/volume1/001.scm
+++ b/others/volume1/001.scm
@@ -1,2 +1 @@
-(display (let ((a (read)) (b (read))) (exact->inexact (/ (+ a b) 2))))
-(newline)
+(format #t "~a\n" (exact->inexact (/ (+ (read) (read)) 2)))
diff --git a/others/volume1/077.pas b/others/volume1/077.pas
new file mode 100644
index 0000000..2d13a4d
--- /dev/null
+++ b/others/volume1/077.pas
@@ -0,0 +1,59 @@
+uses clib;
+
+var
+  n, m: int32;
+  a, b, c: array of int64;
+  i, j: int64;
+
+begin
+  readln(n, m);
+  setlength(a, n);
+  repeat
+    dec(n);
+    read(a[n])
+  until n = 0;
+  qsort(a);
+  setlength(b, m);
+  repeat
+    dec(m);
+    read(b[m])
+  until m = 0;
+  qsort(b);
+
+  setlength(c, 0);
+  for i in a do
+    if (bsearch(b, i) > -1) and
+       ((length(c) = 0) or (c[length(c) - 1] < i)) then
+      begin
+        setlength(c, length(c) + 1);
+        c[length(c) - 1] := i
+      end;
+
+  for i in c do
+    begin
+      dec(n, 2);
+      j := bsearch(a, i);
+      for m := j downto 0 do
+        if a[m] = i then
+          inc(n)
+        else
+          break;
+      for m := j to length(a) - 1 do
+        if a[m] = i then
+          inc(n)
+        else
+          break;
+      j := bsearch(b, i);
+      for m := j downto 0 do
+        if b[m] = i then
+          inc(n)
+        else
+          break;
+      for m := j to length(b) - 1 do
+        if b[m] = i then
+          inc(n)
+        else
+          break
+    end;
+  writeln(n)
+end.
diff --git a/others/volume1/078.pas b/others/volume1/078.pas
new file mode 100644
index 0000000..a202c6a
--- /dev/null
+++ b/others/volume1/078.pas
@@ -0,0 +1,60 @@
+uses clib;
+
+var
+  n, i, j: int16;
+  m: int32 = 0;
+  a, b: array of int16;
+
+procedure sort(l, h: int32);
+  var
+    i, j, k: int32;
+    tmp: int16;
+  begin
+    i := l;
+    j := h;
+    k := (l + h) div 2;
+    repeat
+      while a[i] * b[k] < a[k] * b[i] do
+        inc(i);
+      while a[j] * b[k] > a[k] * b[j] do
+        dec(j);
+      if i <= j then
+        begin
+          tmp := a[i];
+          a[i] := a[j];
+          a[j] := tmp;
+          tmp := b[i];
+          b[i] := b[j];
+          b[j] := tmp;
+          inc(i);
+          dec(j)
+        end
+    until i > j;
+
+    if l < j then
+      sort(l, j);
+    if i < h then
+      sort(i, h)
+  end;
+
+begin
+  readln(n);
+  setlength(a, m);
+  setlength(b, m);
+  for i := 1 to n do
+    for j := 1 to n do
+      if gcd(i, j) = 1 then
+        begin
+          inc(m);
+          setlength(a, m);
+          a[m - 1] := i;
+          setlength(b, m);
+          b[m - 1] := j
+        end;
+  sort(0, m - 1);
+  writeln(m);
+  repeat
+    dec(m);
+    writeln(a[m], ' ', b[m])
+  until m = 0;
+end.
diff --git a/others/volume1/080.pas b/others/volume1/080.pas
new file mode 100644
index 0000000..599511a
--- /dev/null
+++ b/others/volume1/080.pas
@@ -0,0 +1,17 @@
+var
+  n, i, j: int32;
+  b: array of boolean;
+
+begin
+  readln(n);
+  setlength(b, n + 1);
+  for i := 2 to n do
+    b[i] := true;
+  for i := 2 to trunc(sqrt(n)) do
+    if b[i] then
+      for j := 2 to n div i do
+        b[i * j] := false;
+  for i := 2 to n do
+    if b[i] then
+      writeln(i)
+end.
diff --git a/others/volume1/081.pas b/others/volume1/081.pas
new file mode 100644
index 0000000..11dce4b
--- /dev/null
+++ b/others/volume1/081.pas
@@ -0,0 +1,30 @@
+var
+  b: array[0..1000001] of boolean;
+  n, a, i, max: int32;
+
+begin
+  for i := 0 to 1000001 do
+    b[i] := false;
+  readln(n);
+  repeat
+    dec(n);
+    read(a);
+    b[a] := true
+  until n = 0;
+  max := 1;
+  while n < 1000000 do
+    if b[n + 1] and not b[n] then
+      for i := n + 1 to 1000001 do
+        begin
+          if not b[i] then
+            begin
+              if i - n > max then
+                max := i - n;
+              n := i;
+              break
+            end
+        end
+    else
+      inc(n);
+  writeln(max - 1)
+end.
diff --git a/others/volume1/082.pas b/others/volume1/082.pas
new file mode 100644
index 0000000..f195aa7
--- /dev/null
+++ b/others/volume1/082.pas
@@ -0,0 +1,20 @@
+uses clib;
+
+var
+  n: int16;
+  a, g, l: int32;
+
+begin
+  read(n, a);
+  g := a;
+  l := a;
+  while n > 1 do
+    begin
+      dec(n);
+      read(a);
+      g := gcd(g, a);
+      l := l * a div gcd(l, a);
+      writeln(a, ' ', g, ' ', l)
+    end;
+  writeln(g, ' ', l)
+end.
diff --git a/others/volume1/086.scm b/others/volume1/086.scm
new file mode 100644
index 0000000..a45a81d
--- /dev/null
+++ b/others/volume1/086.scm
@@ -0,0 +1,7 @@
+(define (collatz n output)
+  (if (> n 1)
+      (if (= (remainder n 2) 0)
+          (collatz (quotient n 2) (append output '("x 2\n")))
+          (collatz (+ (* n 3) 1) (append output '("div 3\n"))))
+      output))
+(for-each display (reverse (collatz (read) '())))
diff --git a/others/volume1/092.pas b/others/volume1/092.pas
new file mode 100644
index 0000000..246d8cf
--- /dev/null
+++ b/others/volume1/092.pas
@@ -0,0 +1,10 @@
+uses strutils;
+
+var
+  s: ansistring;
+
+begin
+  readln(s);
+  s := delspace1(' ' + s + ' ');
+  writeln(copy(s, 2, length(s) - 2))
+end.
diff --git a/others/volume1/095.pas b/others/volume1/095.pas
new file mode 100644
index 0000000..56300d1
--- /dev/null
+++ b/others/volume1/095.pas
@@ -0,0 +1,11 @@
+uses strutils;
+
+var
+  s: ansistring;
+  i: int32;
+
+begin
+  readln(s);
+  s := ' ' + delspace1(s) + ' ';
+  write(replacetext(copy(s, 2, length(s) - 1), ' ', chr(10)))
+end.
diff --git a/others/volume1/096.pas b/others/volume1/096.pas
new file mode 100644
index 0000000..4cb877c
--- /dev/null
+++ b/others/volume1/096.pas
@@ -0,0 +1,34 @@
+uses math, strutils;
+
+var
+  a, b: ansistring;
+  n: int16;
+  remain: boolean = false;
+  d: uint8;
+
+begin
+  readln(a);
+  readln(b);
+  n := max(length(a), length(b)) + 1;
+  a := addchar('0', a, n);
+  b := addchar('0', b, n);
+  repeat
+    if remain then
+      d := ord(a[n]) + ord(b[n]) - 47
+    else
+      d := ord(a[n]) + ord(b[n]) - 48;
+    if d > 57 then
+      begin
+        dec(d, 10);
+        remain := true
+      end
+    else
+      remain := false;
+    a[n] := chr(d);
+    dec(n)
+  until n = 0;
+  if ord(a[1]) = 48 then
+    writeln(copy(a, 2, length(a) - 1))
+  else
+    writeln(a)
+end.
diff --git a/others/volume1/112.pas b/others/volume1/112.pas
new file mode 100644
index 0000000..0dec65e
--- /dev/null
+++ b/others/volume1/112.pas
@@ -0,0 +1,39 @@
+uses clib;
+
+var
+  a, b: int64;
+  i, j: int32;
+  p: array[2..999983] of boolean;
+  primes: intar;
+
+begin
+  for i := 2 to 999983 do
+    p[i] := true;
+  for i := 2 to 997 do
+    for j := 2 to 999983 div i do
+      p[i * j] := false;
+  j := 0;
+  setlength(primes, 78498);
+  for i := 2 to 999983 do
+    if p[i] then
+      begin
+        primes[j] := i;
+        inc(j)
+      end;
+
+  repeat
+    readln(a, b);
+    a := a * b div sqr(gcd(a, b));
+    b := 0;
+    for i := 0 to bisect_left(primes, trunc(sqrt(a))) do
+      while a mod primes[i] = 0 do
+        begin
+          a := a div primes[i];
+          b := b + 1
+        end;
+    if a = 1 then
+      writeln(b)
+    else
+      writeln(b + 1)
+  until eof(input)
+end.
diff --git a/others/volume1/113.pas b/others/volume1/113.pas
new file mode 100644
index 0000000..64d2af5
--- /dev/null
+++ b/others/volume1/113.pas
@@ -0,0 +1,28 @@
+const
+  cond: array[0..2] of set of char = (
+    ['A', 'H', 'I', 'M', 'O', 'T', 'U', 'V', 'W', 'X', 'Y'],
+    ['B', 'C', 'D', 'E', 'H', 'I', 'K', 'O', 'X'],
+    ['H', 'I', 'N', 'O', 'S', 'X', 'Y']
+  );
+
+var
+  s: ansistring;
+  c: char;
+  b: array[0..2] of boolean;
+  i: int8;
+
+begin
+  readln(s);
+  for i := 0 to 2 do
+    b[i] := true;
+  for c in s do
+    for i := 0 to 2 do
+      b[i] := b[i] and (c in cond[i]);
+  for i := 0 to 2 do
+    if b[i] then
+      write('+')
+    else
+      write('-');
+  writeln
+end.
+end.
diff --git a/others/volume1/clib.pas b/others/volume1/clib.pas
index 101bad3..b9037cd 100644
--- a/others/volume1/clib.pas
+++ b/others/volume1/clib.pas
@@ -125,16 +125,21 @@ interface
       12200160415121876738
     );
 
-  procedure qsort(var a : intar);
   function gcd(x, y: int64): int64;
   function isprime(x: int64): boolean;
   function issquare(x: int64): boolean;
   function ispalindrome(s: ansistring): boolean;
   function all(b: array of boolean): boolean;
+
+  procedure qsort(var a : intar);
   function bsearch(
     a: intar;
     x: int64
   ): int64;
+  function bisect_left(
+    a: intar;
+    x: int64
+  ): int64;
 
 
 implementation
@@ -176,6 +181,7 @@ implementation
     end;
 
 
+  (* Translated from Python 3 math module *)
   function gcd(x, y: int64): int64;
     var z: int64;
     begin
@@ -254,4 +260,28 @@ implementation
       bsearch := -1
     end;
 
+
+  (* Translated from Python 3 bisect module *)
+  function bisect_left(
+    a: intar;
+    x: int64
+  ): int64;
+
+    var
+      l, h, m: int64;
+
+    begin
+      l := 0;
+      h := length(a);
+      while l < h do
+        begin
+          m := (l + h) div 2;
+          if a[m] < x then
+            l := m + 1
+          else
+            h := m
+        end;
+      bisect_left := l
+    end;
+
 end.