AOJ1106 Factorization of Quadratic Formula
問題リンク Factorization of Quadratic Formula
- 概要
2次方程式の整数係数a, b, cが与えられる。これを因数分解し、(px+q)(rx+s)としたときのp, q, r, sを答えよ。
但し、p, q, r, sは全て整数であること。また、0
- 解法
まず、2次方程式の解の公式の判別式Dを計算します。
D<0ならそもそも解が無いのでImpossibleです。
D=0なら、重解を持ちます。-b/(2*a)が方程式の解になります。
D>0なら、異なる解を2つ持ちます。しかし、因数分解の際に整数のみが現れるようにしたいので、解の公式の√が消えないといけません。つまり、Dが平方数ならばp, q, r, sが存在することになります。解の公式より、p, q, r, sが求まり、必要ならばp, qとr, sを交換します。
- ソース
import java.util.Scanner; //Factorization of Quadratic Formula public class AOJ1106 { long gcd(long a, long b){ return b==0?a:gcd(b, a%b); } void run(){ Scanner sc = new Scanner(System.in); while(true){ int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); if((a|b|c)==0)break; double D = b*b-4*a*c; if(D<0)System.out.println("Impossible"); else if(D==0){ int A = 2*a; int B = -b; long g = gcd(Math.abs(A), Math.abs(B)); A/=g; B/=g; System.out.println(A+" "+(-B)+" "+A+" "+(-B)); } else{ int k = 1; while(k*k<=D){ if(k*k==D)break; k++; } if(k*k>D){ System.out.println("Impossible");continue; } int P = 2*a; int Q = -b+k; int R = 2*a; int S = -b-k; long g = gcd(Math.abs(P), Math.abs(Q)); P/=g; Q/=g; g = gcd(Math.abs(R), Math.abs(S)); R/=g; S/=g; Q=-Q; S=-S; if(P>R||(P==R&&Q>S))System.out.println(P+" "+Q+" "+R+" "+S); else System.out.println(R+" "+S+" "+P+" "+Q); } } } public static void main(String[] args) { new AOJ1106().run(); } }