#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里。

posted @ 2020-06-20 16:03  Myrcella  阅读(149)  评论(0)    收藏  举报