[习题练习] 提高组综合训练1
一个数的平方的最后n位只与原数的最后n位有关
\(\text{exgcd}\)
\(\text{exgcd(a, b, x, y)}\)表示\(ax+by=gcd(a,b)\)的一组解
当\(\text{b} = 0\)时 原式为\(\text{ax+by=a}\) 那么必有特解\(\text{x = 1, y = 0}\)
否则当\(\text{b} != 0\)时 递归\(exgcd(b, a%b, x, y)\) 那么就有等式\(x'b + y'(a - a / b * b)=\gcd(a \mod b, b) = \gcd(a, b)\)
那么\(x'b + y'(a - a / b * b) = y'a - b(x' - y'*a/b)=\gcd(a, b) = xa + yb\)
那么\(x = y' b= x' - y'*a/b\) 递归下去 可以得到解
inline void exgcd(ll a, ll b, ll &x, ll &y) {
if(b == 0) {
x = 1; y = 0;
return ;
}
exgcd(b, a % b, x, y);
ll p = x;
x = y;
y = p - (a / b) * y;
}
欧拉路
欧拉路:欧拉路是指从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边通过的且只通过一次。
欧拉回路:欧拉回路是指起点和终点相同的欧拉路。
无向连通图存在欧拉路的条件:
所有点度都是偶数,或者恰好有两个点度是奇数,则有欧拉路。若有奇数点度,则奇数点度点一定是欧拉路的起点和终点,否则可取任意一点作为起点。
有向连通图存在欧拉路的条件:
每个点的入度等于出度,则存在欧拉回路(任意一点有度的点都可以作为起点)
除两点外,所有入度等于出度。这两点中一点的出度比入度大,另一点的出度比入度小,则存在欧拉路。取出度大者为起点,入度大者为终点。
inline void dfs(int u) {
for(int i = head[u]; i; i = edge[i].nxt) {
if(!edge[i].vis) {
edge[i].vis = true;
edge[i ^ 1].vis = true;
dfs(edge[i].to);
ans.push_back(i);
}
}
}