1336 - Sigma Function---LightOj1336

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

题目大意:求1到n之间的数因子和是偶数有几个
对于任意一个x, 都有x = p1^a1*p2^a2*...*pn^an;
所以x的因子和 f(x)= (1+p1+p1^2+p1^3+...+p1^a1)*(1+p2+p2^2+...+p2^a2)*...*(1+pn+pn^2+...+pn^an);
因为偶数乘偶数是偶数,偶数乘奇数还是偶数,只有奇数乘奇数是奇数,所以我们必须让每一个小括号都是奇数。最后我们减去奇数项就只剩偶数项了
1,然后我们发现当x只有2这一个素因子时,再加上一个1一定是奇数。
2, 素数中只有2一个偶数,所以其他素数都是奇数,偶数个奇数想加就是偶数,再加一个1就又会变成偶数,所以p^a(a必须是偶数)x^2的每一个p^a(a一定会是偶数,因为是两个x相乘,所以就是两个a相加,不管是奇数加奇数,还是偶数加偶数都会是偶数)
3,x^2因子和是偶数了,那么2*x^2的因子和也一定是偶数。因为就算再多一个2也没关系,最后还是会加上一个1还是奇数。
所以最后只用减去2^x,x^2和2*x^2,
x^2和2*x^2又包含2^x,所用只用减去x^2和2*x^2.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>

using namespace std;
typedef long long int LL;
#define N 1001000
#define ESP 1e-8
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))

int main()
{
    int T, t=1;
    scanf("%d", &T);
    while(T --)
    {
        LL n;
        scanf("%lld", &n);

        LL sum = n;
        sum -= (int)sqrt(n);
        sum -= (int)sqrt(n/2);

        printf("Case %d: %lld\n", t++, sum);
    }
    return 0;
}

 

 



posted @ 2016-05-31 16:23  啦咯  阅读(764)  评论(0编辑  收藏  举报