Problem:
MathJax.Hub.Config({
tex2jax: { inlineMath: [['\\(','\\)']] }
});

Problem C: Mysterious Operator

ケー氏がいつものように某SNSを閲覧していると、
「解ける人はIQ150以上ある」という問題がタイムラインに流れてきた。
ケー氏はIQが150以上あるので、見るまでもなくその問題を一瞬で解いてしまった。
彼にしてみれば、このような問題なぞに頭を働かせる必要は無い。 コンピュータに任せれば充分なのである。

問題

問題には以下のような謎の数式が書かれていた。

\( 5 + 3 = 28 \)

\( 9 + 1 = 810 \)

\(8 + 6 = 214 \)

\( 5 + 4 = 19 \)

\( 2 + 2 = 4 \)

\( 15 + 8 = 723 \)

\( 7 + 9 = -216 \)

\( 3 + 0 = 33 \)

上記の演算子\( + \)について考えた時、ある正整数\( a \)について\( x \geq 0, y \geq 0 \)かつ\( x + y = a \)になるような整数のペア\( x,y \)の個数を求めよ。

入力

正整数\(a\)が一行で与えられる。

出力

\( a = x + y, x \geq 0, y \geq 0\)を満たすペア\((x,y)\)の個数を一行に出力せよ。

制約

\( 1 \leq a \leq 10^9(= 1000000000) \)

入出力例

入力1

19

出力1

1

\( 5 + 4 \)の1通りである。

入力2

22

出力2

2

\( 11 + 11 \)と、\( 2 + 0 \)の2通りが存在する。

入力3

1

出力3

0

\( 1 + 0 = 11 , 0 + 1 = -11 \)である。\( 1 \)は生成することができない。

入力4

101

出力4

0

\( 1 - 0 \)は\( 101 \)ではないことに注意すること。

入力5

660233276

出力5

4

Solution in Scala (judge verdict: Accepted)

import java.util.Scanner

import scala.collection.Searching._
import scala.annotation.tailrec
import scala.collection.immutable.Queue

class IUnionFind(val size: Int) {

  private case class Node(var parent: Option[Int], var treeSize: Int)

  private val nodes = Array.fill[Node](size)(new Node(None, 1))

  def union(t1: Int, t2: Int): IUnionFind = {
    if (t1 == t2) return this

    val root1 = root(t1)
    val root2 = root(t2)
    if (root1 == root2) return this

    val node1 = nodes(root1)
    val node2 = nodes(root2)

    if (node1.treeSize < node2.treeSize) {
      node1.parent = Some(t2)
      node2.treeSize += node1.treeSize
    } else {
      node2.parent = Some(t1)
      node1.treeSize += node2.treeSize
    }
    this
  }

  def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

  @tailrec
  private def root(t: Int): Int = nodes(t).parent match {
    case None => t
    case Some(p) => root(p)
  }
}


object Main {
  def check(a: Long, b: Long): Boolean = {
    if ((a + b) % 2 == 0 && (a + b) / 2 >= 0 && b - (a + b) / 2 >= 0) (true) else (false)
  }

  def solve(sc: => Scanner): Unit = {
    val A = sc.nextLong()
    var i = 1L
    var ans = 0
    while (i <= A * 10) {
      if ((A % i * 10 >= i) && check(A / i, A % i)) {
        ans += 1
      }
      i *= 10
    }
    println(ans)
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}