#0020. 「Codeforces」1366D Two Divisors
题目大意:
给n个数,每次输出任意一组a,b,满足a,b均为该数因数且和与该数互质(a>1,b>1)。若不存在则输出(-1,-1)
题目解法:
我们把这个给定的数字用x表示
首先我们很容易观察到a,b互质。因为如果a,b有公因数c,a+b必定为c的倍数。又因为a,b为x的因数,所以c也一定是x的因数。这样的话a+b和x必定有公因数c
先给结论,对于任意一个x若有解则一定能构造出一组互质的a,b且满足a*b=x
证明分为两部分:
1. 若构造不出满足a*b=x,gcd(a,b)=1的解,则不存在解
假设存在一组满足题意的a',b',且a'*b'!=x
因为a',b'互质,所以a',b'的质因数互不重合。又因为a',b'为x的因数,分解质因数后每项指数一定不会超过x中该项的指数。
因此a'*b'不可能超过x,即a'*b'=x。
而对于每组这样的a',b',我们显然都可以把每项指数放到最大,转化成a'*b'的情况。
2. 若a*b=x,gcd(a,b)=1,gcd(a+b,x)=1
若a,b互质,一定不存在一个c,使得a%c=b%c=(a+b)%c=0(不然a,b就有公因数c了)
而因为a*b=x,x的质因数要么是a的因数要么是b的因数,不可能再同时为a+b的因数。因此此时a+b,x一定互质
然后我们就可以对x分解质因数,若x只有1个质因数则无解,否则对于x=p1^q1+...+pk^qk,直接令a=p1^q1,b=x/a即可
其实a*b=x这个限制只是想要好写一点,精髓在于把所有质因数要么放在a里要么放在b里。

浙公网安备 33010602011771号