zoukankan      html  css  js  c++  java
  • LightOJ 1336(Sigma Function)

    Sigma Function

    Sigma function is an interesting function in Number Theory. It is denoted by the Greek letter Sigma (σ). This function actually denotes the sum of all divisors of a number. For example σ(24) = 1+2+3+4+6+8+12+24=60. Sigma of small numbers is easy to find but for large numbers it is very difficult to find in a straight forward way. But mathematicians have discovered a formula to find sigma. If the prime power decomposition of an integer is

    Then we can write,

    For some n the value of σ(n) is odd and for others it is even. Given a value n, you will have to find how many integers from 1 to n have even value of σ.


    Input

    Input starts with an integer T (≤ 100), denoting the number of test cases.

    Each case starts with a line containing an integer n (1 ≤ n ≤ 1012).

    Output

    For each case, print the case number and the result.

    Sample Input

    4

    3

    10

    100

    1000

    Sample Output

    Case 1: 1

    Case 2: 5

    Case 3: 83

    Case 4: 947

    题意:函数σ(n)等于n的所有因数之和,问满足σ(k)为偶数的k(1<=k<=n)有多少个。

    分析:题目给出求σ(n)的公式σ(n)=((p1^(e1+1)-1)/(p2-1))*((p2^(e2+1)-1)/(p2-1))*......*((pk^(ek+1)-1)/(pk-1)),

    又根据等比数列公式(p^(e+1)-1)/(p-1)=1+p^1+p^2+......+p^e,

    我们可以先求σ(k)为奇数的个数ans再用n减去ans便是σ(k)为偶数的个数:

    σ(n)为奇数时,(p^(e+1)-1)/(p-1)=1+p^1+p^2+......+p^e 必为奇数,

    (1) 当p为偶数的时候,因为既是偶数又是素数的只有2,故p=2,

    此时(p^(e+1)-1)/(p-1)=2^(e+1)-1必为奇数;

    (2)当p为奇数时,p^k必为奇数,要使(p^(e+1)-1)/(p-1)=1+p^1+p^2+......+p^e为奇数,

    e+1必为奇数,则e必为偶数;

    因此,只有p1,p2,......pk满足(1)或(2)的时候σ(k)为奇数。

    由算术基本定理知,n=p1^e1 * p2^e2 * ...... * pk^ek

    1.当n满足条件(2)时,因为ei为偶数,所以n必为完全平方数,而且可以证明完全平方数n的σ(n)必为奇数;

    2.当n满足条件(1)时,n=2^t * p1^e1 * p2^e2 * ...... * pk^ek ,若t为偶数则它n就是完全平方数,即上面的1,

    若t为奇数则n=2*X (X为完全平方数)。

    因此,只要排除掉n以内的所有完全平方数X和2*X,就可以得到σ(k)为偶数的个数。

    #include<cstdio>
    #include<cmath>
    int main()
    {
        int T,cas=0;
        long long N,ans;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%lld",&N);
            ans=(long long)sqrt(N)+(long long)sqrt(N/2.0);
            printf("Case %d: %lld
    ",++cas,N-ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    石家庄的联通破网络,请大家鉴定
    快速动态访问属性
    TcpRouter端口转发工具
    谈谈我的开发秘密武器
    搞清如何使用oAuth 1.0 & 1.0a
    回顾我学过的编程语言
    jQuery moible 开发笔记之项目设计
    从Minecraft(我的世界)看游戏设计外行人的游戏杂谈
    某android平板项目开发笔记aChartEngine图表显示(2)
    R语言绘图学习笔记之Scatter plots
  • 原文地址:https://www.cnblogs.com/ACRykl/p/8613381.html
Copyright © 2011-2022 走看看