代码源每日一题 2022 - 5 - 2每日一题

首先题目的意思很简单,就不再多描述了。

但是我在写题目的时候还是走了一些弯路。

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值