原创 bzoj 1407(擴展歐幾德里)

題目鏈接   思路: 枚舉最少的山洞數量m,判斷這些野人會不會相遇,即(ci + k*pi)%m==(cj+k*pj)%m k*(pj-pi) + t*m = ci-cj => a*x + b*y = c; 求解同餘方程,如果無解c%gc

原创 矩陣快速冪求+斐波那契(牛客generator 1 )

generator 1   思路: 因爲n過大,用以10爲單位的快速冪求解。   代碼: #include <bits/stdc++.h> using namespace std; const int maxn = 1e6+10; t

原创 C(n,m)預處理

void Init() { c[0][0] = c[1][0] = c[1][1] = 1; for(int i=2;i<maxn;i++) { c[i][0] = 1; for(

原创 求a^b%c(b很大,歐拉降冪)

bzoj 3884   思路: f(p) = 2*2*2*2……*2*2; f(p) = 2^( 2*2*2……*2*2%phi(p)+phi(p) )%p; f(p) = 2^( f(phi(p)) + phi(p) )%p; 遞歸求解

原创 樹狀數組求逆序數

模板 #include <bits/stdc++.h> using namespace std; const int maxn = 1e5+10; int tree[maxn],a[maxn],n; vector <int> vc; i

原创 數字華容道有解的條件

問題: 有n*n的矩陣,分別填入1~n*m-1,和0,給出一個矩陣的局勢,問是否可以將這個局勢變爲有序的最初矩陣。   解法: (eg:圖1的數字順序 1 2 3 4 5 6 7 8 9 10 12 13 14 11 15) 1、m爲奇

原创 hdu 6623(數字x的最小素數的次數)

hdu 6623   思路: 考慮1~n^(1/5)的範圍內的素數,計算在1~n^(1/5)的範圍內的最小素數的次數是多少,然後除去這些素數,得到剩餘的數字m, 考慮m如果大於10009(就是素數1~n^(1/5)範圍內的素數,n的範圍是

原创 hdu 6620(主席樹模板)

hdu 6620   思路: 每次查詢第k小,只有p在改變,所以我們可以枚舉p的左右範圍,因爲題目中保證每個值都不同, 所以省略離散化,直接建立主席樹,二分尋找p的左右範圍,就是最終的答案。   #include <bits/stdc+

原创 #10162. 「一本通 5.2 練習 5」騎士 (帶環樹形dp)

#10162. 「一本通 5.2 練習 5」騎士   思路: 因爲題中存在環,考慮避免出現環。可以用一個並查集維護(如果出現兩個點在同一個集合中就不合並這兩個點)。 同時記錄環上的點,因爲我們不知道要選取環上哪一個點,所以記錄下來,分別

原创 線性基(建立+重構+查詢最大,最小,第k小+判斷是否存在+合併+求交)模板

模板: 題目 來源 線性基合併原理 const int maxn = 5e4+10; typedef long long LL; struct LB { LL b[35],nb[35],num; LB() {

原创 POJ 3177(無向圖縮點模板)

POJ 3177   #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <c

原创 RMQ模板

void Init() { for(int i=1;i<=n;i++) dp[i][0]=a[i]; for(int i=1;(1<<i)<=n;i++){ for(int j=1;j+(

原创 線性基模板

一、基本概念 1、線性基: 在平面中有x向量,y向量兩個方向的向量,這兩個向量是線性無關組,就是可以用着兩個向量組成其他任意向量。 線性基就是類似於這個東西,將一組數的集合按照二進制分解爲一些基底,然後用這些數字去組成其他任何的數字。 2

原创 快乘模板

模板: (使用範圍:當乘法會越界時使用)  LL fast_mul(LL a,LL b,LL c) { LL ans=0; a%=c; while(b) { if(b&1)

原创 帶修主席樹模板(P2617)

P2617   1、思路: 主席樹的思想是通過建立一個區間的前綴和,用root[i]數組記錄這個前綴和 每個區間內存儲這個區間內有多少個數字比它小,更新時通過新建一個新的節點將之前的節點值存儲在 新的節點值中,同時更新這個新的節點值,也將