• C


    一个让人脑洞大开的题。

    题目大意比较简单,询问[1,n]有多少个数其因子和为偶数。

    因子分解定理中求因子和的公式是

    f(n)=(1+p1+p1^2+p1^3+...+p1^a1)(1+p2+p2^2+...+p2^a2)....

    如果让因子和为偶数,首先我们看一下两个数相乘怎么才能得到偶数:

    even*even=even 

    2 even*odd  =even

    3 odd*even  =even。

    会有三种情况,但是如果要得到奇数只需要odd*odd=odd,所以我们不妨求因子和为奇数的情况。

    即让(1+pi+pi^2+...+pi^ai)为奇数,也就是让(pi+pi^2+...+pi^ai)为偶数。这里的pi是素数,在素数中,只有2是偶数,其余全部是奇数。

    首先假设一个数x是奇数,也质因子中就是不含有2。要让(1+pi+pi^2+...+pi^ai)全为奇数,只需要让(pi+pi^2+...+pi^ai)为偶数,只要偶数个奇数相加才会出现奇数所以我们的ai应该是偶数才可以。又因为x=p1^a1*p2^a2*...=(p1^(a1/2)*p2^(a2/2)...)^2,而p1^(a1/2)*p2^(a2/2)...又可以构成一个新的数c,所以x=c^2,所以x应该是一个平方数。

    然后如果x是个偶数,也几就是质因子中含有2。2是一个偶数,应该让它出现奇数次(假设为d次)才行,

    d=d1+1,那么d1一定是个偶数,所以x=2^(d1+1)*(p1^(a1/2)*p2^(a2/2)...)^2=2*(2^(d1/2)*p1^(a1/2)*p2^(a2/2)...)^2。所以x=2*(c^2)。

    所以我们只要计算这俩x的个数就行了。。。。

    code:

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        int t;
        cin>>t;
        for(long long  i=1;i<=t;i++){
            long long  n;
            cin>>n;
            long long  sum=0;
            sum+=sqrt(n);
            sum+=sqrt(n/(long long )2);
            printf("Case %d: %lld
    ",i,n-sum);
        }
        return 0;
    }
  • 相关阅读:
    RestTemplate proxy 设置方式
    一道关于主键,闭包的软考题------关系代数复习-码,范式,闭包求解
    MyBatis的XML中使用内部类的方式
    MyBatis SpringBoot 杂记
    服务器安装笔记
    UML符号
    npm 设置代理
    国外一家代码网站
    设计模式复习
    docker 列出每个容器的IP
  • 原文地址:https://www.cnblogs.com/Accepting/p/12614891.html
Copyright © 2020-2023  润新知