http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1336
题意:
求1-N中有多少数的因数之和是偶数
思路:
题目给了两个公式。一个是任意数可以化成质因数次方的积,第二个是求因数之和的公式。
由公式可知,如果任意一个是偶数的话,那么就是个偶数,因为
奇数* 奇数= 奇数,偶数*偶数=偶数,奇数*偶数= 偶数,
1.当p为2时,,一定是一个奇数
2.当p不为2时,因为素因子只有2是偶数,那么对于其他的素因子它的e+1如果是偶数的话,那么就是偶数,拿e+1=4举个栗子吧
(1)
化简为,因为p为除了2以外的素因子(皆为奇数),所以为偶数,
在举一个e+1 = 6的例子:
(2),因为是一个奇数,而是一个偶数,奇*偶=偶,
所以e+1为偶数时,结果为偶数
但当e+1为奇数时(e是偶数),就不可这样化简。
即对于一个数a,它的 和 必定是奇数,
因为2无论何值都为奇数,所以2对结果不影响。
对于任意的b,如果b的质因数(除2以外)全是偶次项,那么它一定是奇数,并且2是偶次项的可以由得来,那如果2是奇数项,就不能从得来,所以2为奇数项是要由得来,所以红字可证
举个例子:
根据上面的推导,是偶数,而且是奇数,如果只算的话,那么就把给漏掉了,所以也要算上,可有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;
}