牛牛的k合因子數

2021-10-03 02:22:11 字數 1246 閱讀 2430

合數是指自然數中除了能被1和本身整除外,還能被其他數(0除外)整除的數。

牛牛最近在研究「k合因子數」,所謂「k合數」是指乙個數的所有因子中,是合數的因子共有k個。

例如20的因子有1,2,4,5,10,20,其中4,10,20為合數,它有3個合數因子,就稱20是乙個 「3合因子數」

牛牛想要知道1~n中給定k的情況下k合因子數的數目。

輸入描述:

第一行輸入兩個數字n,m(1≤n,m≤10^5)

表示範圍以及查詢「k」的數目

接下來m行,每行乙個正整數k(1≤k≤n)

查詢k合因子數的數目。

輸出描述:

一行乙個數字,表示k合因子數的數目

輸入10 512

345輸出

4100

0說明1~10的範圍內

1合因子數有:4,6,9,10,共4個

2合因子數有:8,共1乙個

看題解的**看了好一會兒,終於看懂了…

所以寫一下自己對這段**的理解,也算是想讓自己牢記這種寫法吧

這題肯定是要判斷合數的,那麼合數的判斷體現在哪?

這個寫法的巧妙點就在於陣列a

我們讓a[i]等於0,表示i是乙個素數,否則,i就是乙個合數

j的遍歷是按i的整數倍來的,很容易可以知道,如果j是乙個數(0,1 除外)的倍數,那麼j肯定不是素數

但是判斷合因子數,也要考慮因子是否為素數,在迴圈時,如果它的乙個因子是素數,那麼它的合因子數就不能增加

舉個例子

i=2,j=6時,可以發現a[j]等於1,那是說明j不是素數,同時,1是它的合因子數,6是它的合因子

當迴圈到i=3,j=6時,因為前面找到乙個大於1的因子(也就是2)時,顯然(a[6]==0)是不成立的,那麼能否讓合因子數增加的關鍵就是看3是不是素數,因為3是素數,所以,儘管3是6的因子,但合因子數卻不能增加

#include

using

namespace std;

int n,m,k,num;

int a[

100005

],b[

100005];

intmain()

return0;

}

牛牛的k合因子數

題目描述 合數是指自然數中除了能被1和本身整除外,還能被其他數 0除外 整除的數。牛牛最近在研究 k合因子數 所謂 k合數 是指乙個數的所有因子中,是合數的因子共有k個。例如20的因子有1,2,4,5,10,20,其中4,10,20為合數,它有3個合數因子,就稱20是乙個 3合因子數 牛牛想要知道1...

牛客 3004 H 牛牛的k合因子數

合數是指自然數中除了能被1和本身整除外,還能被其他數 0除外 整除的數。牛牛最近在研究 k合因子數 所謂 k合數 是指乙個數的所有因子中,是合數的因子共有k個。例如20的因子有1,2,4,5,10,20,其中4,10,20為合數,它有3個合數因子,就稱20是乙個 3合因子數 牛牛想要知道1 n中給定...

醜數(因子只有 2 3 5 的數)

理解題意關鍵 如果說乙個數的因子只有 2 3 5 那麼反過來想,這個數一定是由若干個 2 3 5 相乘得到的,所以每一次只需要找出當前所有已知醜數中由2 3 5 相乘可以得到的最小的數即可。也就是說每乙個醜數,都可以由之前的醜數乘 2 3 5 得到。具體做法 設定三個指標,初始他們都指向第乙個醜數 ...