合數是指自然數中除了能被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 得到。具體做法 設定三個指標,初始他們都指向第乙個醜數 ...