《演算法競賽高階指南》0x32約數

2022-05-20 10:48:10 字數 1176 閱讀 8944

求解[1,n]之間的最大的反素數,有性質:

這個反素數是質因數個數最多的數中最小的乙個。

證明:①假設有乙個數質因數個數比它多,如果在他前面,不滿足反素數的定義,如果在他後面,一定可以找到第乙個質因數比它大的數,這個數作為結果更好,反證可知,這個數質因數一定是最多的

,②反證:假設有質因數與他的個數一樣但是比他小,那麼一定有g(i)>=g(m),與反素數的定義矛盾。故這個數是質因數個數最多的乙個數中最小的乙個。

可以證明這個數一定是又連續的素數構成,且質數非嚴格單調減,通過交換質因子即可證明。且最多有九個質因子。

**:

#includeusing

namespace

std;

intn;

typedef

long

long

ll;int prime=;

ll maxx;

ll ans;

ll c[

20];//

指數 void

dfs(ll now,ll last,ll sum,ll prod)

return

; }

ll p=prod;

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

}int

main()

優化一下,其中指數為0的時候是沒有貢獻的,所以考慮刪除這一點,還有,無效分支需要減掉,下面的**在2000000000條件下dfs了1460次,比較高效。

指數 int cnt=0

;ll final[

20];

void

dfs(ll now,ll last,ll sum,ll prod)

for(int i=1;i<=last;i++)

}int

main()

演算法競賽高階指南 0x00

快速冪模板,寫一下快速冪的原理。我們知道,乙個數 n 在二進位制 也可以是其他進製 下可以被表示為 a 1 a 2 2 1 a 3 2 2 a m 2 那麼我們可以考慮將其分拆成二進位制狀態下的每一位,然後做冪運算。這樣做的時間複雜度為 o log 2 n 實現的過程類似於倒過來的分治 當然也可以直...

演算法競賽高階指南 0x11 棧 Editor

通過觀察我們可以將這個序列通過2個棧和2個陣列來維護5種操作進而達到題解,為了方便,直接用陣列來模擬棧 stkl n 游標左邊的棧 stkr n 游標右邊的棧 tl 左棧指標 tr 右棧指標 s n 字首和陣列 f n 最大字首和 對於第乙個操作,在游標處插入x,就是給stkl 的棧頂插入乙個x,字...

《演算法競賽高階指南》0x03差分

給定乙個序列,只能對乙個區間加一或者減一,問至少需要多少步使得所有數都變成一致的?有多少種一致序列?利用差分,對乙個區間進行加一或者減一的話,一定是乙個差分 1加上另乙個差分 1。如下 includeusing namespace std typedef unsigned intui typedef...