PKU : 2295 - A DP Problem

問題概要

http://poj.org/problem?id=2295
一次方程式を解く問題です.
答えがひとつに決められる場合は, その数字を出力.
答えが複数通りに決まる場合は, IDENTITY
答えがない場合は, IMPOSSIBLE

アルゴリズム

構文解析するだけです.
しかし, ひっかかるケースが多いのでWA出しまくりました.

  • マイナスにおける切り捨て処理
  • 等式が数字のみで構成されている場合
    • 10=10 -> IDENTITY
    • 10=12 -> IMPOSSIBLE

あと, BigIntegerで実装しましたが, ただのintでいいみたいです

プログラム

public class Main{
  public static void main(String[] args)throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    while(n-- > 0){
      String[] s = br.readLine().split("=");
      Pair left = getPair(s[0]);
      Pair right = getPair(s[1]);
      BigInteger x = left.x.subtract(right.x);
      BigInteger val = right.val.subtract(left.val);

      if(x == null){
        if(left.val.equals(right.val)){
          System.out.println("IDENTITY");
        }
        else{
          System.out.println("IMPOSSIBLE");
        }
      }
      if(x.equals(BigInteger.ZERO)){
        if(val.equals(BigInteger.ZERO)){
          System.out.println("IDENTITY");
        }
        else{
          System.out.println("IMPOSSIBLE");
        }
      }
      else{
        BigInteger div = val.divide(x);
        BigInteger rem = val.remainder(x);

        if(div.compareTo(BigInteger.ZERO) >= 0 ||
           rem.equals(BigInteger.ZERO)){
          System.out.println(div);
        }
        else{
          System.out.println(div.subtract(BigInteger.ONE));
        }
      }
    }
  }

  public static Pair getPair(String s){
    String[] ss = s.split("\\+|\\-");
    ArrayList<Character> al = new ArrayList<Character>();

    for(char ch : s.toCharArray()){
      if(ch == '+' || ch == '-'){
        al.add(ch);
      }
    }

    Pair res = new Pair(ss[0]);
    for(int i=0;i<al.size();i++){
      if(al.get(i) == '+'){
        res = res.add(new Pair(ss[i+1]));
      }
      else{
        res = res.subtract(new Pair(ss[i+1]));
      }
    }

    return res;
  }
}

class Pair{
  BigInteger x,val;

  Pair(BigInteger x,BigInteger val){
    this.x = x;
    this.val = val;
  }

  Pair(String s){
    if(s.contains("x")){
      if(s.charAt(0) == 'x') s = "1";
      this.x = new BigInteger(s.replaceAll("x",""));
      this.val = BigInteger.ZERO;
    }
    else{
      this.x = BigInteger.ZERO;
      this.val = new BigInteger(s);
    }
  }

  Pair add(Pair p){
    BigInteger nx = x.add(p.x);
    BigInteger nval = val.add(p.val);
    return new Pair(nx,nval);
  }

  Pair subtract(Pair p){
    BigInteger nx = x.subtract(p.x);
    BigInteger nval = val.subtract(p.val);
    return new Pair(nx,nval);
  }
}