zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    系统学Python-01
    pandas(二)
    matplotlib
    Python数据分析-初识numpy、pandas、scipy、matplotlib和Scikit-Learn等数据处理库
    Python进行读取或写入等文件操作时的路径问题
    pandas(一)
    00 Python及第三方库的安装问题
    sorted ()函数和列表中的sort()函数
    git 获取branch名和commit id
    查看Android log 和TEE Log
  • 原文地址:https://www.cnblogs.com/Accepting/p/12614891.html
Copyright © 2011-2022 走看看