求出類似斐波那契數列的第$n$項
$n\leq 10^}$
我想著尤拉降冪。。。其實尤拉降冪並不適用於矩陣的運算
隊友看了題之後立馬想到十進位制的矩陣快速冪,太強了
和普通的矩陣不同的是,這個每次乘十前進,但這不是問題
對矩陣快速冪的時間複雜度認識得不深,潛意識以為$n$是乙個無窮大的數
#include #define ll long longusing namespace std;
const int maxn = 1e6 + 5;
struct maritx
s;int mod,x0,x1;
char in[maxn];
maritx mul(maritx a,maritx b)
int main()
}printf("%d\n",(ans.num[2][1]*x1%mod+ans.num[2][2]*x0%mod)%mod);
return 0;
}
給出$s$和$t$兩個字串,計算$s$的子串數量,十進位制形式大於$t$字串
定義$dp[i][j][k]$,考慮$s$的$i$個字元,組成長度為$j$的子串中,$k=0$小於$t$的前$j$位,$k=1$等於$t$的前$j$位,$k=2$大於前$j$位的數量
#include #define ll long longusing namespace std;
const int maxn = 3e3 + 5;
const ll mod = 998244353;
ll dp[maxn][maxn][3];
char s[maxn],t[maxn];
int main()
}}int main()
return 0;
}
給出一些數,選出最多的數,所有數對中,不能出現只差一位的情況
對於只差一位的數,我們可以建立一條雙向邊,這題轉化為,求乙個最大的沒有邊連線的點集
也就是二分圖的最大獨立子集
根據題目的描述,肯定不存在奇數環,可以根據1的數量的奇偶來劃分二部圖,同為奇數的數字不可能只相差一位,所以這是個合理的二分圖
只有圖中點可以被分成兩個部分,相同部分的點之間沒有連邊時,才可以使用二分圖匹配
最大獨立子集+最小頂點覆蓋=v
最小頂點覆蓋=最大匹配
找獨立子集的方法是,從左邊所有沒有匹配的點出發,去找到一條沒匹配,匹配,沒匹配,匹配的路徑,並且標記路徑上的點
選出左邊標記點和右邊未標記的點作為獨立子集
證明:
#include#include#include#define ll long longusing namespace std;
const int maxn = 5e3+7;
int vis[maxn];
int l[maxn],r[maxn],cnt1,cnt2,n,num[maxn],match[maxn];
int head[maxn],edge_num;
struct edgeedge[30*maxn];
bool check(int x)
return 0;
}void dfs1(int x,int fla)
}void add_edge(int a,int b)
bool dfs(int x)}}
return 0;
}int main()}}
for(int i=1;i<=n;i++)
if(vis[i]==0)dfs1(i,1);
int ans=n;
for(int i=1;i<=cnt1;i++)
printf("%d\n",ans);
for(int j=1;j<=n;j++)vis[j]=0;
for(int i=1;i<=cnt1;i++)
if(match[l[i]]==0)dfs(l[i]);
for(int i=1;i<=cnt1;i++)
if(vis[l[i]])printf("%d ",num[l[i]]);
for(int i=1;i<=cnt2;i++)
if(vis[r[i]]==0)printf("%d ",num[r[i]]);
printf("\n");
return 0;
}
2019牛客多校訓練(四)
給出一顆樹 讓所有染色點到某個點的最大距離最小 結果為最遠點對的距離除二向上取整 假設有最遠點對的路徑上的中間點 如果有某個點它到這個中間點要遠,那麼最遠點對就不是最遠點對了,產生矛盾 利用樹上點對路徑唯一性,兩次 dfs 求出染色點直徑 include define ll long long de...
2019牛客暑期多校訓練1
equivalent prefixes 這個是乙個用單調棧的題目,至於為什麼可以用單調棧?把兩個陣列同時跑單調棧,如果每次進棧最多乙個,當然在這個進棧之前肯定會有數出棧,如果存在乙個數進棧了,然後這個時候判斷一下進棧的這個數的位置是不是相同,如果不相同就說明肯定是不對的。為什麼說這個時候只要考慮這個...
2019牛客暑假多校訓練營(第五場)
矩陣快速冪,a n,n特別大,想到求某數sum sum 10 s i 0 可以把n一位一位拆開,ans ans 10 st s i 0 指數相加所以分開相乘 十進位制優化類似快速冪!includeusing namespace std typedef long long ll const ll ma...