cosnt int N=1e5+10; int n,c,d[N]; vector<int> E<N>; void dfs(int u, int fa) { for (int v : E[u]) { if (v == fa) continue; d[v] = d[u] + 1; if (d[v] > d[c]) c = v; dfs(v, u); } }
int main() { scanf("%d", &n); for (int i = 1; i < n; i++) { int u, v; scanf("%d %d", &u, &v); E[u].push_back(v), E[v].push_back(u); } dfs(1, 0); d[c] = 0, dfs(c, 0); printf("%d\n", d[c]); return 0; }
int n, c = 0, t = 0, s = 0, mx = 0; int d[N]; vector<int> e[N]; vector<int> path;
void dfs1(int u, int fa) { for (auto v : e[u]) { if (v == fa) continue; d[v] = d[u] + 1; if (d[v] > d[c]) c = v; dfs1(v, u); } }
bool dfs2(int u, int fa) { // 寻找 t,并把路径 push 回溯 if (u == t) { path.push_back(u); return true; } for (auto v : e[u]) { if (v == fa) continue; if (dfs2(v, u)) { path.push_back(u); return true; } } return false; }
树形dp
我们定义 dp[u]:以 u为根的子树中,从 u 出发的最长路径。那么容易得出转移方程: dp[u]=max(dp[u],dp[v]+w(u,v)),其中的
v 为
u 的子节点, w(u,v) 表示所经过边的权重。
#include<bits/stdc++.h> #define ll long long #define yes cout<<"Yes"<<endl #define no cout<<"No"<<endl using namespace std; #define debug(a) cout<<#a<<"="<<a<<endl; #define rep(i, a, b) for(ll i = (a); i <= (b); i++) #define per(i, a, b) for(ll i = (a); i >= (b); i--) const int N=1e5+10; int n; struct node { int nxt,pre; }a[N];
import math import libnum import gmpy2 import sympy
# 已知数据 d = ... e = 0x10001 c = ...
ed1=e*d-1 #ed-1=k(p-1)(q-1) for k in range(65537,1,-1): #从65537开始递减 if ed1%k==0: phi=ed1//k p1,s1=gmpy2.iroot(phi,2)#这里做的开放处理是因为近似qp相等 p=gmpy2.next_prime(p1) if phi%(p-1)==0: q=sympy.prevprime(p) break n=p*q m=pow(c,d,n) print(libnum.n2s(int(m)))
# 已知的公钥指数 e 和密文 c e = 65537 c = 26766985375623703113904250876884598223156426789118183045142542215836711584140516370218654279179189004314203387292364759414400477630158
# 遍历每个组合,计算可能的 n 并尝试解密 for comb in possible_combinations: # 计算模数 n 和欧拉函数 phi_n n = reduce(lambda x, y: x * y, comb) phi_n = reduce(lambda x, y: x * (y - 1), comb, 1)
try: # 计算私钥 d d = inverse(e, phi_n)
# 尝试解密密文 m = pow(c, d, n)
# 将解密后的消息转换为字节形式 plaintext = long_to_bytes(m)
# 打印解密结果(可能的 flag) print(f"Possible flag with n = {n}: {plaintext.decode()}")
except ValueError: # 如果计算 d 或解密失败,则跳过此组合 continue
补充reduce函数:
1、reduce(lambda x, y: x * y, comb) 使用 Python 的 reduce 函数,对组合 comb 中的所有素数执行连续的乘法运算。
2、reduce(lambda x, y: x * (y - 1), comb, 1) 使用 reduce 函数,对组合 comb 中的每个素数 p进行p-1,即计算欧拉函数。