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;
    }
  • 相关阅读:
    几个关于设计的小问题
    基于建立/保持时间等的参数化时序分析
    Stratix内嵌存储器测试报告
    采用流水线技术实现8位加法器
    运算顺序引发的一系列有趣问题
    PON系统基础知识简介
    某MDU产品OMCI软件升级加速方案
    研究生期间接受的指导(二)
    研究生期间接受的指导(一)
    1063 Set Similarity (25 分)
  • 原文地址:https://www.cnblogs.com/Accepting/p/12614891.html
Copyright © 2011-2022 走看看