main(); if (strlen($cww->result) <= 10000) { echo $cww->result.PHP_EOL; } else { echo "NO".PHP_EOL; } return; class Cww { public $stack; public $x; public $y; public $z; public $result; public $a; public $b; public function __construct($x, $y, $z) { $this->result = ""; $this->stack = array(); $this->x = $x; $this->y = $y; $this->z = $z; $this->a = 0; $this->b = 0; } public function main() { if ($this->calc() == false) { $this->result = "NO"; return; } // echo "a, b = $this->a, $this->b".PHP_EOL; // 負数の可能性のあるbを先にスタックに保存 for ($i = 0; $i < abs($this->b); $i++) { $this->pushSW(); } // a を加算 if ($this->a >= 1) { $this->pushSC(); } for ($i = 1; $i < $this->a; $i++) { $this->plusX(); } // b を加算または減算 if ($this->b < 0) { while (count($this->stack) >= 2) { $this->pushBW(); } } else if ($this->b >= 0){ while (count($this->stack) >= 2) { $this->pushBC(); } } } public function calc() { $hasAnswer = false; // z = ax + by をみたす a, bを求める。 // x,y,z > 0 から、a,bがともに負になることはないので、a>=0 とする。 if ($this->y == 0) { if ($this->x == 0) { $this->a = 0; $this->b = 0; return true; } else if (($this->z % $this->x) != 0) { // echo "false?".PHP_EOL; return false; } else { // echo "truee".PHP_EOL; $this->a = $this->z / $this->x; $this->b = 0; return true; } } for ($i = 0; $i<=$this->z; $i++) { if ((abs($this->z - $i*$this->x) % $this->y) == 0) { $this->a = $i; $this->b = ($this->z-$this->a*$this->x)/$this->y; $hasAnswer = true; break; } } // "a,b = $this->a, $this->b".PHP_EOL; return $hasAnswer; } // 最上位スタックの数字をチェック public function check() { $c = count($this->stack); return ($c >= 1) ? $this->stack[$c - 1] : false; } // 最上位スタックの数字にxを加算 public function plusX() { $this->pushSC(); return $this->pushBC(); } // 最上位のスタックの数字にyを加算 public function plusY() { $this->pushSW(); return $this->pushBC(); } // 'c' を読込 public function pushSC() { array_push($this->stack, $this->x); $this->result .= "c"; return true; } // 'w' を読込 public function pushSW() { array_push($this->stack, $this->y); $this->result .= "w"; return true; } // 'C' を読込 // スタックに2つ以上要素がない場合は false public function pushBC() { if (count($this->stack) >= 2) { $tmp = array_pop($this->stack); $tmp += array_pop($this->stack); array_push($this->stack, $tmp); $this->result .= "C"; return true; } else { return false; } } // 'W' を読込 // スタックに2つ以上要素がない場合は false public function pushBW() { if (count($this->stack) >= 2) { $tmp = array_pop($this->stack); $tmp -= array_pop($this->stack); array_push($this->stack, $tmp); $this->result .= "W"; return true; } else { return false; } } }