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

链接LightOJ - 1336 Sigma Function

题意:

σ ( x ) \sigma(x) 表示 x x 的所有因数之和,给出 n    ( 1 n 1 0 12 ) n\;(1\le n\le10^{12}) ,问 1 1 ~ 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 ) = ( 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})

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

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

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


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

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

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

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



以下代码:

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

发布了214 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Ratina/article/details/99192378