歌德說:「了解自己最好的方式,不是沉思,而是行為。」質數這個東西就是,你知道他是什麼,但是每次換個考法你就不會了。
首先,日常判斷質數的**:
(最初耗時最長)
bool isprime(int x)}}
bool isprime(int x)}}
質數這個知識點有很多考法,今年第二次訓練營就有考到:
算數基本定理,又稱唯一分解定理,算術基本定理可表述為:我以為這個題考的是質數分解→數字→字串 其實並不是。任何乙個大於1的自然數 n,如果n不為質數,那麼n可以唯一分解成有限個質數的乘積。
即n=p1^e1⋅p2^e2...pm^em(p1示例1
3
示例25
10
f(2)=2342
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的)ac**:有了篩法樹之後按照題意模擬將質數全部取出來,然後模擬拼接,加起來即可。
之所以採用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)的數字是幾位數。
#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 缺少的數字...