原创 dijkstra、heap+dijkstra、擴展應用

heap+dijkstra 堆優化的dij,就是在更新最短路時,將更新最短距離的點的編號和當前最短距離壓入優先隊列,下一次再取點的時候不需要遍歷了。注意當取出的點的最短距離大於更新之後的最短距離時,就棄之不用。 時間複雜度O(|E

原创 Codeforces Round #597 (Div. 2) D.Shichikuji and Power Grid(虛擬原點在最小生成樹中的應用)

題意: n個城市供電,要求每個城市或自己建立發電站,或與建立了發電站的城市直接或間接相連。給出每個點的橫縱座標xi,yi,以及每個點的建站花費和連線參數wi,ci,如果兩座城市i、j之間連線,則花費爲(ci+cj)*(ij之間的曼

原创 kruskal板子及證明

我們先從一個點出發吧。 1.對於在連通圖中的一個點,所有連接這個點的邊中的權值最小邊,必定是此圖最小生成樹中的一條邊。 證明:比如,這個點是x,x到y的邊最小,假設這條邊不在最小生成樹中,那就有類似x–>a–>y在最小生成樹中(因

原创 遍歷Map的四種方法

public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put(“1”, “val

原创 費馬小定理

費馬小定理是這樣的,對於整數aaa,和質數ppp,如果aaa與ppp互質,那麼有 ap−1≡1(modp)a^{p-1} ≡1(modp)ap−1≡1(modp) ,歐拉將其上升爲 ap≡a(mod)pa^p≡a(mod)pap≡

原创 線性篩

線性篩的時間複雜度爲O(n),相比於普通的素數篩,在數據量巨大的情況下更快.然而線性篩可能常數較大,因此數據量小的時候仍然可以普通素數篩。 線性篩: public static int prime[]=new int[maxn]

原创 分解素因子(唯一分解定理)

1.唯一分解定理,也叫算術基本定理,指的是任何n>=2,都可以分解爲n=p1* p2 * p3 * … * pn,其中pi爲質數。 其包括兩個斷言: 斷言1:數n可以以某種方式分解成素數乘積。 斷言2:僅有一種這樣的因數分解。(除

原创 並查集擴展

簡單並查集。要注意的是,像這種結點帶有很多信息,要求對結點信息按連通分量進行彙總的並查集,可以不要在union操作裏進行,而選擇在進行完所有合併後,對所有結點遍歷進行彙總。這樣不容易出錯。 #include <stdio.h>

原创 lightoj 1282 - Leading and Trailing(數論,n^k前幾位)

題意:求nk的前三位和後三位,1<=n<231 ,1<=k<=107 解法:後三位很好求,只需要對nk 進行對1000取模的快速冪運算,時間複雜度log(k) 前三位,由於牽扯到進位問題,無法單純用冪運算解決。 n可以用10a 表

原创 LightOJ 1336 Sigma Function(數論,sigma函數,唯一分解定理,奇偶性)

題意:統計1~n以內因子和爲偶數的數有多少個,1<=n<=1e12。 題目給出了由唯一分解定理推導出的n的 所有因子和 公式,稱爲sigma函數。 n質因子分解後: 那麼sigma函數可表示爲: 以上爲題目。 其實sigma函

原创 模運算的運算法則及逆元的計算

模運算與基本四則運算有些相似,但是除法例外。其規則如下: (a + b) % p = (a % p + b % p) % p (a - b) % p = (a % p - b % p) % p (a * b) % p = (a %

原创 博弈論總結

一、巴什博弈 1、問題模型:只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取m個,最後取光者得勝。 這類博弈是可以自己當場推的。比如,按原題意,設M=3,N=10,那麼我們可以從N=0開始推面臨這個N的人的

原创 矩陣快速冪

先來回顧一下整數快速冪的代碼: public static long qmi(long b, int i,int mod) { long ans=1; for(;i>0;i>>=1,b=b*b%mod)if((i&1)==