LightOJ1336 Sigma Function(思维)

http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1336

题意:

求1-N中有多少数的因数之和是偶数

思路:

题目给了两个公式。一个是任意数可以化成质因数次方的积,第二个是求因数之和的公式。

由公式可知,如果任意一个\frac{p^{e + 1} - 1}{p-1}是偶数的话,那么\sigma (n)就是个偶数,因为

奇数* 奇数= 奇数,偶数*偶数=偶数,奇数*偶数= 偶数,

1.当p为2时,\frac{p^{e + 1} - 1}{p-1},一定是一个奇数

2.当p不为2时,因为素因子只有2是偶数,那么对于其他的素因子它的e+1如果是偶数的话,那么就是偶数,拿e+1=4举个栗子吧

(1)\fn_jvn \frac{p^4-1}{p - 1} =\frac{(p^2+1)*(p^2-1)}{p-1}=\frac{(p^2+1)*(p+1)*(p-1)}{p-1}

      化简为(p^2+1)(p+1),因为p为除了2以外的素因子(皆为奇数),所以(p^2+1)(p+1)为偶数,

     在举一个e+1 = 6的例子:

(2)\frac{p^6-1}{p-1} = \frac{(p^3-1) *(p^3 + 1)}{p-1},因为\frac{p^3-1}{p-1}是一个奇数,而p^3+1是一个偶数,奇*偶=偶,

      所以e+1为偶数时,结果为偶数

     但当e+1为奇数时(e是偶数),就不可这样化简。

即对于一个数a,它的 a^22a^2 必定是奇数,

因为2无论何值都为奇数,所以2对结果不影响。

对于任意的b,如果b的质因数(除2以外)全是偶次项,那么它一定是奇数,并且2是偶次项的可以由\sqrt{b}得来,那如果2是奇数项,就不能从\sqrt{b}得来,所以2为奇数项是要由\frac{\sqrt{b}}{2}得来,所以红字可证

  举个例子:

   5 = 5 ^1,25 = 5 ^ 2,50 = 2 * 5^2,100=2^2*5^2 

根据上面的推导,\sigma (5)是偶数,而且\sigma (25)是奇数,如果只算a^2的话,那么就把\sigma (50)给漏掉了,所以2a^2也要算上,\sigma (100)可有50推得, 所以只用乘2即可.

AC代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string>
#include <string.h>
using namespace std;
int main(int argc, const char * argv[]) {
    int n;
    scanf("%d", &n);
    int cnt = 0;
    while (n--) {
        long long int t ;
        scanf("%lld", &t);
        printf("Case %d: ", ++cnt);
        long long int a, b;
        a = sqrt(t);
        b = sqrt(t / 2);
        printf("%lld\n", t - a - b);
    }
    return 0;
}

参考链接:https://www.cnblogs.com/Ritchie/p/5299970.html

猜你喜欢

转载自blog.csdn.net/henu_jizhideqingwa/article/details/81485972