首先题目的意思很简单,就不再多描述了。
但是我在写题目的时候还是走了一些弯路。
1:第一想法我把公式化简之后变成了(x+y)*k=x*y,然后当时在想如果要表现出来得用o(n^2)的时间复杂度,所以就没有继续思考了。
2:然后我想到了将k拆分,例如12可以拆分位1 * 12 , 2 * 6 , 3 * 4 ,然后得到六个数,所以当将1/k同时乘以n倍。然后只要拆分出一个1/n*12,另外一个的分子还为1的话那只要是 n 为上面拆分出的数+1那就可以,所以我推测出的情况就是6种,但是很明显是不符合题目的。
3:然后我用下面的for循环测试了一下
果然存在我漏掉的情况,所以我觉得这个想法是行不通的。
4:又回到最初的想法,然后我发现题目其实特别简单,只要将一个字母表示成另外一个字母就行,x = y * k /(y-k),所以题目就是使得右边部分为正整数的y的个数。然后要注意的是我们要循环的范围,很明显下限为k+1,上限需要思考一下就是2*k,因为这里的分子都要为1,所以最大只能是k的俩倍。
然后就是代码:
#include<iostream>
using namespace std;
int main()
{
long long k , x , y;
cin >> k;
int ans = 0;
for(long long i = k + 1 ; i<= 2 * k ; i ++)
{
if( (i * k) % (i - k) == 0)
ans ++;
}
cout << ans <<endl;
return 0;
}