牛客演算法基礎訓練營2 質數的不同考法

2021-10-19 05:54:25 字數 2133 閱讀 5367

歌德說:「了解自己最好的方式,不是沉思,而是行為。」

質數這個東西就是,你知道他是什麼,但是每次換個考法你就不會了。

首先,日常判斷質數的**:

(最初耗時最長)

bool isprime(int x)}}

bool isprime(int x)}}

質數這個知識點有很多考法,今年第二次訓練營就有考到:

算數基本定理,又稱唯一分解定理,算術基本定理可表述為:

任何乙個大於1的自然數 n,如果n不為質數,那麼n可以唯一分解成有限個質數的乘積。

即n=p1^e1⋅p2^e2...pm^em(p1示例1

3
5
示例2

10
342
f(2)=2

f(3)=3

f(4)=22

f(5)=5

f(6)=23

f(7)=7

f(8)=222

f(9)=33

f(10)=25

2+3+22+5+23+7+222+33+25=342(這是題目給出的解題關鍵,然而當時我只想著用字串轉化成數字,又不會寫..../菜鳥落淚)

我以為這個題考的是質數分解→數字→字串 其實並不是。

這道題主要考的是:dfs/dp,數論;

出這個題是因為,發現有的人學篩法學的真的死。//而我這個菜鳥,連死的都沒學

就,他的埃式篩就真的就只能用來篩質數。

線性篩存了無數個板子,什麼《線性篩質數》,《線性篩因子數》,《線性篩因子和》,《線性篩尤拉函式》,《線性篩莫比烏斯函式》....

確實很多演算法沒必要搞懂底層原理,比如說一些卷積類,圖論演算法。搞懂其實也玩不出花來。但是顯然篩法不一樣,與其存一坨不如好好學一下。

順便也提一句,線性篩不是埃式篩的上位替代。該會的都得會,又不是玩手遊,怎麼還搞五星六星上下位替代。

埃式篩有個花活,就是它可以配合莫比烏斯函式做一些簡單的數論容斥。在某些數論問題當中可以略微代替莫反。

(莫反也是容斥,但是比較重,而且推式子比較苦手,能篩的話肯定是選篩啊)

解題思路:

這裡是選自題解姐姐的乙個大小為10的篩法樹。/*小白插個話,我認為這個是用並查集的思想,所有的數字最終都能歸結到1,

但是質數一般是與1直接連線,我們就可以從這裡下手。*/

從篩法樹上的節點往根節點爬,取出沿途的邊權質數,就得到了對於某節點質因數分解的全部質數。

有「篩法樹」這個思想以後,線性的質因數分解就變成了基操。(當然,分解確實是線性的,如果要列印出來就還是log的)

有了篩法樹之後按照題意模擬將質數全部取出來,然後模擬拼接,加起來即可。

之所以採用dp,是乙個時間複雜度的問題,我們可以將時間複雜度降到o(n)。然後這個dp方程不難推,舉個特例:

f(2)=2

f(4)=22=f(2)*10+2;

f(8)=222=f(4)*10+2;

....

坑點:除了2,3,5,7以外,其他質數可不止一位。所以實際上還要記錄當前f(x)的數字是幾位數。

ac**:

#include #include #include using namespace std;

int n;

long long f[4000100];

long long mod = 1e9+7;

int calc(int x)

int main()

}long long ans =0;

for (int i = 2; i <= n; i++)

printf("%lld", ans);

return 0;

}

牛客寒假演算法基礎訓練營6

早知道這次題目這麼簡單就認真做了,最後一場沒心做,後面懶得想了,唉罪過罪過 1 煤氣灶 題目描述 小j開始打工,準備賺錢買煤氣灶。第一天,小j的工資為n元,之後每天他的工資都比前一天多d元。已知煤氣灶需要m元,求小j最少工作幾天才能買到煤氣灶。輸入描述 四個整數 n,m,d,x 分別表示小j第一天的...

牛客寒假演算法基礎演算法訓練營2

1 座與重修費 題目描述 期末考試結束了,座發現很多人掛了大物,只能等著第二年重修,還要交400元的重修費。座突然想起有個學長和他講過,如果學校哪一年缺錢了,那一年的大物試卷就會特別難。現在 座有了所有人的成績,座想知道如果所有掛科的人都在第二年重修,學校能賺多少重修費?掛科是指一門課的分數小於60...

牛客寒假演算法基礎訓練營1 G

這道題的題解講的非常好了已經,對於1 n數的排列子區間 l,r 使得區間中的數滿足連續的條件為 r l max a l r min a l r l,r為下標 既然要使 l,r 為萌區間,那麼就要找到這個區間內的最大值mx與最小值mn,判斷是否滿足條件 若不滿足條件,那麼需要將 mn,mx 缺少的數字...