LightOJ - 1336 Sigma Function(唯一分解定理,n以内平方数个数)

本文详细解析了LightOJ-1336题目,探讨了求解1到n范围内数的σ值为偶数的计数问题。通过分析唯一分解定理,得出奇数和偶数在σ函数中的规律,并提出了一种高效的计算方法。

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

链接LightOJ - 1336 Sigma Function

题意:

σ ( x ) \sigma(x) σ(x)表示 x x x的所有因数之和,给出 n    ( 1 ≤ n ≤ 1 0 12 ) n\;(1\le n\le10^{12}) n(1n1012),问 1 1 1 ~ n n n中有多少数的 σ \sigma σ值是偶数?



分析:

根据唯一分解定理,有 x = p 1 a 1 ⋅ p 2 a 2 ⋯ p k a k x=p_1^{a_1}\cdot p_2^{a_2}\cdots p_k^{a_k} x=p1a1p2a2pkak

σ ( x ) = ( 1 + p 1 + p 1 2 + ⋯ + p 1 a 1 ) ( 1 + p 2 + p 2 2 + ⋯ + p 2 a 2 ) ⋯ ( 1 + p k + p k 2 + ⋯ + p k a k ) \sigma(x)=(1+p_1+p_1^2+\dots+p_1^{a_1})(1+p_2+p_2^2+\dots+p_2^{a_2})\cdots(1+p_k+p_k^2+\dots+p_k^{a_k}) σ(x)=(1+p1+p12++p1a1)(1+p2+p22++p2a2)(1+pk+pk2++pkak)

由于 奇数 × \times ×奇数 = = =奇数 ,    ,\; ,偶数 × \times ×奇数 = = =偶数,所以我们可以 讨论 σ ( x ) \sigma(x) σ(x)为奇数的情况,即 所有乘数均为奇数 的情况。

p = 2 p=2 p=2时,可以发现,无论 a a a是多少, ( 1 + p + p 2 + ⋯ + p a ) (1+p+p^2+\dots+p^a) (1+p+p2++pa)都一定为奇数

而当 p ≠ 2 p\neq2 p̸=2时(则质因数 p p p一定是奇数),可以发现,仅当 a a a为偶数的时候, ( 1 + p + p 2 + ⋯ + p a ) (1+p+p^2+\dots+p^a) (1+p+p2++pa)为奇数,否则为偶数。


然后,我们可以对质因数 2 2 2的指数 a a a进行讨论,若 a a a是偶数,因为其他质因数的 a a a也是偶数,所以这个数满足 k 2 k^2 k2
a a a是奇数,同理,因为其他质因数的 a a a是偶数,则这个数满足 2 ∗ k 2 2*k^2 2k2

所以,我们只需要找到上述两种数的个数:

  • n n n以内满足 k 2 k^2 k2的个数: n \sqrt n n (因为 1 1 1 ~ n \sqrt n n 的所有数平方后都在 n n n以内)
  • n n n以内满足 2 ∗ k 2 2*k^2 2k2的个数: n 2 \sqrt \frac{n}{2} 2n (因为 1 1 1 ~ n 2 \sqrt \frac{n}{2} 2n 的所有数平方后乘以 2 2 2都在 n n n以内)

则最终答案为 a n s = n − n − n 2 ans=n-\sqrt n-\sqrt \frac{n}{2} ans=nn 2n



以下代码:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int main()
{
    int T,kase=0;
    scanf("%d",&T);
    while(T--)
    {
        LL n,ans;
        scanf("%lld",&n);
        ans=n-(LL)sqrt(n)-(LL)sqrt(n/2);
        printf("Case %d: %lld\n",++kase,ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值