計算
\[\sum_^x^j\mod
\]其中,\(p\)為質數,\(n\le10^9\)。
結論很簡單,以下式子成立$$\sum_xj\mod=0$$
那麼我們只要求最後3項就可以獲得答案
這個結論可以依靠打表獲得,比賽時很多隊依靠打表發現了結論輕鬆的過了這題,而我們的電腦空閒長達1個小時卻沒有嘗試打表。對於一些沒有思路的題目不妨可以依靠這種方法尋找規律
還沒補,大概思路有,補完填坑
對於有根樹t,定義$$f(t)=\sum_dist(x,y)$$求\(n\)個節點的有根樹t中,滿足\(f(t)_\)和\(f(t)_\)的樹分別有多少種。
考慮無根樹,滿足\(f(t)_\)的樹一定是一條鏈,但是注意正鏈與反鏈相同,因此共有$$\frac\prod_^i$$種。
而滿足\(f(t)_\)的樹肯定是菊花樹(乙個點連著剩下\(n-1\)個點),共有$$n$$種。
然後考慮有根情況,而對於有根樹根不同樹便不同。因為n個點每個點都可以作為根,因此有根樹的數量就是無根樹的數量乘以\(n\)。
因此,結論:
\[f(t)_=\frac\prod_^i
\]\[f(t)_=n^2
\]
#includeusing namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const ll inv = 5e8+4;
int main()
cout << ans1 << ' ' << ans2 << endl;
return 0;
}
691e - xor-sequences
長度為n的陣列中選取k個數字組成序列x(可重複選取),要求\(x_x_\)二進位制下1的位數是3的倍數,求滿足條件的陣列的數量。
設二維陣列\(d_\)儲存序列\(\)是否滿足要求,滿足要求為1不滿足為0,二維陣列\(c_\)儲存的是某一長度下\(\)(即以\(x_i\)為序列開頭,\(y_i\)為序列結尾)的方案數。
很顯然當長度為1時,\(d_=c_\).
那麼長度為3時,二維陣列\(c_\)所表示的意義(長度)可以由以下轉移式轉移:$$c_ = \sum_^d_d_$$可以理解成列舉k,以i開頭k結尾的序列和以k開頭j結尾的序列拼接起來是否合法,有多少種合法方案累加起來。而這個公式就是矩陣乘法。
同理,當長度大於3時,$$c_ = \sum_^c_d_$$,這樣就可以使矩陣c的意義由\(l-1\)轉移到\(l\),那麼轉移到長度為k就要乘矩陣d共\(k-1\)次。
那麼做法就很明顯了,先預處理\(d_\),而由於長度為2時\(c_=d_\),而我們要讓矩陣c乘以矩陣d共\(k-1\)次,也就是d矩陣的\(k-1\)次冪。這題就轉換成矩陣快速冪了。
codeforces 691f
從n個數字中取2個,得分為兩個數字之積,當得分高於乙個閾值p時獲勝。給你m個數字p,問你以當前p為閾值時獲勝的數字對的數量。
先預處理每個數字的數量,然後直接列舉數字\)},計算有多少數字對可以湊成,最後對陣列求字首和就可以計算失敗的數字對。
這題直接列舉數字\)}複雜度是\(n2\),而我們可以換個思路,由列舉\)}計算\)}轉換為列舉\)},因為閾值p是有上限的。這樣列舉的複雜度就由\(n2\)轉換為\(n\log\)。
近期題目歸納(2016 07 08)
題意 給一串由ox組成的字串,根據x為 0 分,o為 1 分,當o連續多個時o的分數為它前面連續0的個數。解法 統計連續o的個數就好啦。用乙個標記變數tag來計算,遇到x時tag 0,遇到乙個o就對tag進行 1。到每個位置只要累加tag就好了。include include include inc...
Linux入門 近期學習整理
前幾天去了下洛陽玩。回來之後就連續看到了編寫應用程式 不過今天和訊為的技術支援聊了一下,他給我發了一下聊天記錄主要是告訴乙個新人如何入門 總結一下就是 這些都是訊為技術人員提供的 uboot 就是乙個bootloader作為引導,uboot 檢測記憶體,儲存等裝置,並且設定處理器等裝置的時鐘等等,期...
C語言 近期學習整理
1 sizeof和strlen有哪些區別?區別如下 1 sizeof是操作符,strlen是函式。2 sizeof操作符的結果型別是size t,它在標頭檔案中typedef為unsignedint型別,該型別保證能容納實現所建立的最大物件的位元組大小。3 sizeof可以用型別做引數,strlen...