浙大OJ 1003 Crashing Balloon 分解因数
🍑 ZOJ 1003 Crashing Balloon
输入
343 49
3599 610
62 36
输出
49
610
62
🍑 大体思路
🍤 分解两个数的因数对,只要有质因数冲突了,说谎
🍤 无法分解成 0-100 之间的因数,说谎
import java.util.Scanner;
public class Main
{
static boolean aflag, bflag;// 记录 a b 有无说谎
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while (sc.hasNext())
{
int a = sc.nextInt();
int b = sc.nextInt();
if (a < b)//保证 a 是高分方
{
int t = a;
a = b;
b = t;
}
// 假设 a b 都说谎
aflag = false;
bflag = false;
dfs(a, b, 1);
int res = a;
if (!aflag && bflag)//当 a 说谎 并且 b 没有说谎时,b 才可能赢
res = b;
System.out.println(res);
}
}
// m n 为 a b 除去因子后的值,p 为现在搜到的因子数值
private static void dfs(int m, int n, int p)
{
if (m == 1 && n == 1)// 两个数都顺利分解完了(没撒谎),a win(分数高)
{
aflag = true;
return;
}
if (n == 1)// b 分解因数成功,至少说明 b 没说谎
bflag = true;
while ((p < m || p < n) && (p < 100))
{
p++;
if (m % p == 0)
{
dfs(m / p, n, p);
if (aflag)// 只要 a 没说慌,由于 a 分数高,那肯定是 a win
return;
}
if (n % p == 0)
{
dfs(m, n / p, p);
if (aflag)// 只要 a 没说慌,由于 a 分数高,那肯定是 a win
return;
}
}
}
}
👨🏫 参考文章