除数の数学

除数の数学

所与\(m個\)異なる正の整数\(A_1、A_2、\ cdots、A_M \) くださいため\(0 \)する(m個\)\\(K \)のセクションで、算出される\ ([1、N] \)正の整数のある\(\)を正確に\(K \)除数番号。

エクストリーム試験問題は、言語能力に直面しています。

日常の一般的な品質係数の分解が、私たちは品質係数の分解が非常に面倒になります後に統計を見つけ、見つかった\(m個\)、\ (a_iを\)すべての数字と数については非常に小さいので、我々は単純になります\(m個\)それぞれ、すべての可能な前処理の約数スロースタックの数は、直接の後、フォームを展開しているsort答えは、線形統計することができ、スタック。

また、我々はそれを見つける\は([1、N] \ ) 各数値は一度だけカウントすることができ、その間隔\は([1、N] \ ) されたどのように多くの正の整数で持っている(\)を\丁度0に数が約数の数であり、\(N-和\)

#include <cstdio>
#include <iostream>
#include <cmath>
#include <stack>
#include <algorithm>
int s[10000010],s_top;
int res[202];
int n,m,a[202];
int main(){
    scanf("%d %d", &n, &m);
    for(int i=1;i<=m;++i) scanf("%d", &a[i]);
    for(int i=1;i<=m;++i){
        int tmp=(int)sqrt(a[i]);
        for(int j=1;j<=tmp;++j)
            if(a[i]%j==0) s[++s_top]=j,s[++s_top]=a[i]/j;
        if(tmp*tmp==a[i]) --s_top;
    }
    std::sort(s+1, s+1+s_top);
    int cur_cnt=1;
    for(int i=2;i<=s_top;++i){
        if(s[i]>n) break;
        if(s[i-1]==s[i])
            ++cur_cnt;
        else{
            ++res[cur_cnt];
            cur_cnt=1;
        }
    }
    ++res[cur_cnt];
    int sum=0;
    for(int i=1;i<=m;++i) sum+=res[i];
    printf("%d\n", n-sum);
    for(int i=1;i<=m;++i) printf("%d\n", res[i]);
    return 0;
}

おすすめ

転載: www.cnblogs.com/santiego/p/11748457.html