题解 UVA10976 【分数拆分 Fractions Again?!】
实际发表时间:2020-04-13
https://www.luogu.com.cn/problem/UVA10976
先来康康柿子
前面的题解都是逆向推的,我就来正向推
\[\dfrac{1}{k}=\dfrac{1}{x}+\dfrac{1}{y}
\]
\[\text{通分一下}
\]
\[\dfrac{1}{k}=\dfrac{x+y}{xy}
\]
\[\text{去分母}
\]
\[\dfrac{1}{k}\times kxy=\dfrac{x+y}{xy}\times kxy
\]
\[xy=k(x+y)
\]
\[\text{去括号,挪一下}
\]
\[xy-kx-ky=0
\]
\[\text{两边加一个神奇的东西}k^2
\]
\[xy-kx-ky+k^2=k^2
\]
\[\text{然后就可以十字相乘来分解}
\]
\[(x-k)(y-k)=k^2
\]
于是暴力枚举\(k^2\)的因数\((x-k)\)和\((y-k)\)即可
要输出个数,我们可以把结果写成结构体,存进队列\(q\),个数就是\(q.size()\)
复杂度\(\mathcal{O}(\sqrt{k^2})=\mathcal{O}(k)\),可以过
代码:
#include<bits/stdc++.h>
using namespace std;
struct ans
{
int x,y;
};//储存结果
queue<ans>q;//队列
int k;
int main()
{
while(~scanf("%d",&k))
{
int res=k*k;
//暴力枚举k²的因数
for(int i=1;i<=k;i++)if(res%i==0)q.push((ans){res/i,i});
printf("%d\n",q.size());//输出个数
while(!q.empty())printf("1/%d = 1/%d + 1/%d\n",k,k+q.front().x,k+q.front().y),q.pop();//输出结果
}
return 0;
}

浙公网安备 33010602011771号