挑戰程式競賽系列(14) 2 6素數

2021-08-02 20:39:37 字數 2833 閱讀 6068

詳細**可以fork下github上leetcode專案,不定期更新。

練習題如下:

非常easy,素數就是從最小數開始生成的,它的倍數都不是素數,應該說這是素數最本源的定義了。

**如下:(艾氏篩法)

public

static

void

main(string args) throws numberformatexception, ioexception

}prime[i] = k;

}bufferedreader br=new bufferedreader(new inputstreamreader(system.in));

string str;

while ((str=br.readline())!=null)

}

思路:艾氏篩選+bfs,起初做法是暴力bfs,不管三七二十一,把所有符合條件的素數加入佇列中,結果執行即慢,在oj上還mle了,後來才發現bfs也可以剪枝。剪枝的方法:用dp記錄到達當前素數的路徑長度,如果先前已經抵到過了,則不再需要加入佇列。

**如下:

/**

* bfs + seive

*@param args

*@throws ioexception

*/public

static

void

main(string args) throws ioexception

}static

int max = 9999 + 16;

static

boolean isprime;

public

static

void

seive()}}

}public

static

intsolve(int from, int to)}}

return dp[to];

}public

static

intnext(int prime, int digit, int change)

return

0; }

唉,也不知道是在考閱讀理解,還是真的學演算法,理解了半天都不知道它到底說的啥意思,題目真的太含糊。實際上是求:乙個數的質因子個數,及這些質因子組成數列的排列組合,順序無所謂,但要考慮重複質因子。

公式: 排列

數=n!

∏ki=

1ni!

其中,n表示所有質因數的個數,ni

表示,每個質因子的出現的個數。

如:

100: ,
並沒有使用pollardrho演算法,暴力做法也有o(

n√) ,num在220

範圍內,此題夠了。

**如下:

public

static

void

main(string args) throws ioexception

in.close();

}public

static string solve(int num)

long cnt = 1;

for (int key : factors.keyset())

cnt = factor(max) / cnt;

return max + " " + cnt;

}public

static

long

factor(long n)

return res;

}public

static mapprimefactor(int num)

}if (num != 1)

return factors;

}

思路:艾氏篩選,接著合成hsemiprime,這道題剛開始以為求出所有的hprime之後,直接合成不會存在重複元素,所以用二分或者帶方向的遍歷就完事,可惜它居然存在重複元素!

**如下:

public

static

intsolve(int h)

return cnt;

}

測試用例過不了(合成中存在重複元素,所以只能記錄所有可能的hsemiprime),這樣的話,就在程式初始化時就全部算出來即可,再用accumalte,進行統計,簡單。

**如下:

public

static

void

main(string args)

in.close();

}static

int max = 1000001 + 16;

static

boolean hprime;

static

long prime;

static

boolean hsemiprime;

static

int accumalte;

public

static

void

seive()

int k = 0;

for (int i = 5; i < max; ++i)}}

hsemiprime = new

boolean[max+1];

for (int i = 0; i < k; ++i)

}accumalte = new

int[max+1];

for (int i = 1; i < accumalte.length; ++i)

}

挑戰程式競賽系列(17) 3 1最大化平均值

詳細 可以fork下github上leetcode專案,不定期更新。練習題如下 01分數規劃,具體可以參考博文寫的非常詳細且通俗易懂。我的認識 中學裡學過二分法求函式零點,其實該 模擬的就是這種求解過程,所以只要寫出目標函式,零點不難求。接著就得到了求和式 i 1n ai l bi 0要刪除k個物品...

挑戰程式設計競賽(3)

給定整數a1,a2,an,判斷是否可以從中選出若干數,使他們的和恰好為k。1 n 20 1e8 ai 1e8 1e8 k 1e8 樣例1input 4 1 2 4 7 13 output yes 13 2 4 7 樣例2input 4 1 2 4 7 15 output no dfs include...

挑戰程式設計競賽 樹

二叉樹的表達 樹的遍歷 從根r到結點x的路徑長度為x的深度 depth 結點x到葉結點的最大路徑長度成為結點x的高。請編寫乙個程式,輸出給定有根樹t中各節點u的資訊。採用 左子右兄弟表示法 1 結點u的父節點 2 結點u最左側的子結點 3 結點u右側緊鄰的兄弟結點 引用u.parent即可知道結點u...