zoukankan      html  css  js  c++  java
  • 【11.4测试】divisors

    题目描述
    给定m 个不同的正整数a1,a2,.... am,请对0 到m 每一个k 计算,在区间[1, n] 里有多少正整数

    是a 中恰好k 个数的约数。

    输入
    第一行包含两个正整数n,m,分别表示区间范围以及a 数组的大小。

    第二行包含m 个不同的正整数a1,a2,.... am,表示a 数组。

    输出
    输出m + 1 行,每行一个整数,其中第i 行输出k = i 的答案。

    样例输入
    10 3
    4 6 7
    样例输出
    4
    4
    1
    1
    数据范围

     m<=200,n<=10^9,ai<=10^9

    题解:emmm数论大法好,注意0的情况由所有情况推过来即可。

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int N=1e7+2;
    int ans[N],n,m,xx,c[N],cnt;
    
    void Yao_Chen(int x){
        for(int i=1;i*i<=x;i++){
            if(x%i==0){
                c[++cnt]=x/i;
                c[++cnt]=i;
            }
            if(i*i==x) cnt--;
        }
    }
    
    int main(){
        freopen("div.in","r",stdin);
        freopen("div.out","w",stdout);
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d",&xx);
            Yao_Chen(xx);
        }
        sort(c+1,c+cnt+1);
        int last=c[1],sum=1,ps=0;
        for(int i=2;i<=cnt && c[i]<=n;i++){
            if(c[i]!=last)
               { ans[sum]++; last=c[i]; sum=1; }
            else sum++;
        }
        ans[sum]++;
        for(int i=1;i<=m;i++)
            ps+=ans[i];
        printf("%d
    ",n-ps);
        for(int i=1;i<=m;i++)
            printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    rpm
    java 锁4
    java 锁3
    小技巧:在线生成按钮Shape的网站
    Python入门:内置函数
    山东理工大学SDUT
    Android项目实战(四十):Andoird 7.0+ 安装APK适配
    Android打赏功能:支付宝转账
    浅谈Android数据库DBFlow
    acffo的开源项目汇总
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11792901.html
Copyright © 2011-2022 走看看