TonyYin's Blog

Back

题意#

给定正整数 n109n\leq 10^9,需要构造出不超过 10510^5 个真分数,满足:

  • a1b1+a2b2++atbt+1n=1\frac{a_1}{b_1}+\frac{a_2}{b_2}+\cdots+\frac{a_t}{b_t}+\frac{1}{n}=1.
  • 对每个分数,bi<nb_i<nbinb_i\mid n.

若无解,输出 1-1,否则给出一组可行解。

分析#

先将 nn 质因数分解,分下列情况讨论。

#

首先考虑特殊情况。n=pmn = p^m,其中 pp 是质数。

要选一个因数作为分母,发现 nn 的任意一个因数 bb,都一定是 pap^a 的形式。

因为分母为 11 时不合题意,所以在 11 之外,我们任选 nn 的两个因子,不妨设为 c,dc, d,一定有 gcd(c,d)1\gcd(c, d)\neq 1.

又因为 gcd(n1,n)=1\gcd(n-1, n)=1,而 gcd(c,d)1\gcd(c, d)\neq 1。以 c,dc, d 作为分母,一定不合法。

也就是说,n=pmn=p^m 时,不存在合法解

#

对于其他情况,nn 一定可以被表示为两个互质的数的乘积。一种构造方法是:

nn 质因数分解,不妨 n=p1m1p2m2ptmtn=p_1^{m_1}p_2^{m2}\cdots p_t^{m_t},令 x=p1m1x=p_1^{m_1}y=p2m2ptmty=p_2^{m_2}\cdots p_t^{m_t},显然 xy=nxy=ngcd(x,y)=1\gcd(x, y)=1.

为了方便,我们钦定 xyx\leq y。如果按照上面的方法得到的 x>yx>y,交换 x,yx, y 即可。

k=2k=2 时,设题目所求的 a1b1=cx\frac{a_1}{b_1}=\frac{c}{x}a2b2=dy\frac{a_2}{b_2}=\frac{d}{y}.

我们需要求出一组 (c,d)(c, d) 满足 cx+dy=11ncy+dxxy=n1n\frac{c}{x}+\frac{d}{y}=1-\frac{1}{n}\Rightarrow \frac{c\cdot y+d\cdot x}{xy}=\frac{n-1}{n}.

因为 xy=nxy=n,这等价于满足:

cy+dx=n1c\cdot y+d\cdot x=n-1

继续整理,把 cyc\cdot y 移到右侧,得到:

d=n1cyxd=\frac{n-1-cy}{x}

注意 c,dZ+c, d\in \Bbb{Z}^+

先不考虑 dd 的正负性。由于 xnx\mid n,有:

dZx(n1cy)x(1+cy)d\in \Bbb{Z}\Rightarrow x\mid(n-1-c\cdot y)\Rightarrow x\mid (1+c\cdot y)

想要找到满足 x(1+cy)x\mid (1+c\cdot y)cc,考虑直接枚举

注意到 gcd(x,y)=1\gcd(x, y)=1。当 cc1,2,x11, 2, \cdots x-1 时,都有 x(cy)x\nmid (c\cdot y),所以 cyc\cdot y 的取值构成 modx\operatorname{mod} x 的完全剩余系。

也就是说,当 cc 遍历 1x11\sim x-1 时,cymodxc\cdot y\bmod x 的取值两两不同,也恰好完全覆盖1x11\sim x-1.

因此,一定存在 c[1,x1]c\in[1, x-1] 满足 x(cy+1)x\mid (c\cdot y+1).

再看 dd 的正负性。由于 1+cy1+(x1)y=1+xyy=n(y1)<n1+c \cdot y \leq 1+(x-1) \cdot y=1+xy-y=n-(y-1) < n,所以 n(1y)>0n-(1\cdot y)>0.

因此,一定有 d=n1cyx>0d=\frac{n-1-cy}{x}>0.

综上#

我们先按照 x=p1m1x=p_1^{m_1}y=p2m2ptmty=p_2^{m_2}\cdots p_t^{m_t} 的方法找到 (x,y)(x, y).

之后,在范围 1x11\sim x-1 中枚举 cc,找到满足 x(cy+1)x\mid(c\cdot y+1)cc,计算出 d=n1cyxd=\frac{n-1-cy}{x}

(cx,dy)(\frac{c}{x}, \frac{d}{y}) 即为满足题意的两个分数。

时间复杂度#

找到 (x,y)(x, y) 的部分,需要对 xx 分解质因数,时间复杂度为 O(n)\mathcal{O}(\sqrt{n}).

枚举 cc 的部分,因为我们钦定了 xyx\leq y,把 [1,x1][1, x-1] 看作 xx 个数,那么:

x=xxxy=nx=\sqrt{x\cdot x}\leq \sqrt{x\cdot y}=\sqrt{n}

所以总时间复杂度是 O(n)\mathcal{O}(\sqrt{n}) 的。

代码#

int n;
vector<int> fac;
int main() {
	scanf("%d", &n);
	int p1 = -1;
	for(int i = 2; i * i <= n; i++) {
		if(n % i == 0) {p1 = i; break;}
	}
	if(p1 == -1) p1 = n;
	int x = p1, y = n / p1;
	while(y % p1 == 0) y /= p1, x *= p1;
	if(y == 1) {
		cout << "NO" << endl;
		return 0;
	}
	int ansc, ansd;
	for(int c = 1; c <= x - 1; c++) {
		if((c * y + 1) % x == 0) {
			ansc = c; ansd = (n - 1 - c * y) / x;
			break;
		}
	}
	cout << "YES\n2\n" << ansc << " " << x << "\n" << ansd << " " << y << endl;
	return 0;
}
cpp
【CodeForces-1089F】Fractions
https://www.tonyyin.top/blog/oi-solution/cf1089f
Author TonyYin
Published at October 30, 2021
Comment seems to stuck. Try to refresh?✨