• 1336


    1336 - Sigma Function
    Time Limit: 2 second(s) Memory Limit: 32 MB

    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

    Output for Sample Input

    4

    3

    10

    100

    1000

    Case 1: 1

    Case 2: 5

    Case 3: 83

    Case 4: 947


    Problem Setter: Shahriar Manzoor
    Special Thanks: Jane Alam Jan (Solution, Dataset)
    思路:他让求的是偶数的个数,所以我们可以求奇数的个数因为从公式中看,如过要为偶数的话其中有一项为偶数就可以了,如果要为奇数的话所有的都要是奇数,目前我们还不知道
    那个方向简单,我们可以两方向都考虑下,最后会发现求奇数方案可行。素数中除了2以外全为奇数,如果数中含有2因子,那么(p1)e1+1/(p1-1)肯定为奇数,这个很好证明,如果p1
    为其它素数,如果((p1)e1+1-1)/(p1-1)要为奇数那么e1必定为偶数,我们可以用二项展开证明
    因为p1为奇数,设p1=2*k+1;将p1代入,
    所以要为奇数的话e1必定要是偶数。所以从1,循环到sqrt(n),因为要素数的幂是偶数次那么(除了2的幂可以为奇数可以为偶数),所以判定下(i*i)<=n和2*i*i<=n有多少就行了。
     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<string.h>
     5 #include<math.h>
     6 using namespace std;
     7 typedef long long LL;
     8 int main(void)
     9 {
    10         int i,j,k,p,q;
    11         LL ans;
    12         scanf("%d",&k);
    13         int s;
    14         for(s=1; s<=k; s++)
    15         {
    16                 scanf("%lld",&ans);
    17                 LL cnt=0;
    18                 for(j=1; j<=sqrt(1.0*ans); j++)
    19                 {
    20                         LL bns=(LL)j;
    21                         if(bns*bns<=ans)
    22                         {
    23                                 cnt++;
    24                         }
    25                         if(2*bns*bns<=ans)
    26                         {
    27                                 cnt++;
    28                         }
    29                 }
    30                 printf("Case %d: ",s);
    31                 printf("%lld
    ",ans-cnt);
    32         }
    33         return 0;
    34 }

    复杂度O(sqrt(n));

    油!油!you@
  • 相关阅读:
    Golang 实现简单的 Web 服务器
    Aliyun linux repo文件
    云服务器查看登录ip和本机出口ip
    10个高效Linux技巧及Vim命令对比
    使用mkfs.ext4格式化大容量磁盘
    LINUX SHELL 多个命令一起执行的几种方法
    GPT分区
    3种方法更改Linux系统的主机名(hostname)
    Nginx代理访问RDS
    Centos7安装Docker
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5381723.html
Copyright © 2020-2023  润新知