第13届广工大校赛 F 题 等式 【数学推导 + 约数个数定理】

本文讲解了一种数学问题的编程解决思路,通过将原问题转化为求特定形式的因子个数,进而快速找到所有可能的正整数解。文章详细解释了如何通过配方移项的方法简化问题,并提供了一个高效的算法实现,用于计算给定数值下特定形式因子的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门
题意: 就是求1/x + 1/y = 1/n(x <= y),给定n,求x, y的正整数解.

思路:刚那道题是懵逼的, 比赛时也是乱搞的, 后面知道正解了…. (没想到啊), 首先化解原式:
yn + xn = xy -> xy - xn - yn = 0 -> xy - xn - yn + n^2 =n^2 -> (x-n)(y-n) = n^2;
化完这里就应该好想了. 那么解就是n^2的因子个数取值num, ans = (num+1)/2; 因为num 是x和y的全部取值, 所以我们应该/2, 然后有相等的取值, 所以是(num+1)/2, 最重要的还是要化得出来上面那个的最终形式. 也就是学会配方移项来解!

还有就是算n的因子个数最快√n, 但是n^2, 就是n的复杂度了, 直接算肯定会T, 那么我们要利用n^2的特点, 直接还是算n的, ^2就是最后素数因子个数*2即可, ^k次方就是素数因子个数*k, 然后就可以√n求啦.

AC Code

int cal(int n) {
    ll ans = 1;
    for (int i = 2 ; i*i <= n ; i ++) {
        if (n % i == 0) {
            int cnt = 0;
            while(n % i == 0) {
                cnt++;
                n /= i;
            }
            ans *= 2*cnt + 1;
        }
    }
    if (n != 1) ans *= 3;
    return (ans+1)/2;
}
void solve()
{
    int n;
    while(cin >> n) {
        cout << cal(n) << endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值