• 1336


    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
    ", t++, sum);
        }
        return 0;
    }
     
    
    
    
    
    
    
  • 相关阅读:
    新的知识点来了-ES6 Proxy代理 和 去银行存款有什么关系?
    JavaScript中一种全新的数据类型-symbol
    箭头函数的this指向问题-一看就懂
    ES6中对函数的扩展
    ES6中对象的扩展
    ES6中对数组的扩展
    ES6中对数值的扩展
    UWP --- Display Content 显示基础内容
    ViewBag & ViewData
    Bubble Sort冒泡排序
  • 原文地址:https://www.cnblogs.com/linliu/p/5546293.html
Copyright © 2020-2023  润新知