训练地址
#include
#define x first
#define y second
using namespace std;
const int N = 100010, M = 400010;
int h[N], e[M], ne[M], w[M], idx;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f3f;
typedef pair<ll, ll> P;
ll d[N], dist[N][20];
int vis[N], vis2[N];
void add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}
int cal(int u, int v)
{
int cnt = 0;
while(v > u){
cnt++;
v >>= 1;
}
return cnt;
}
void dijkstra(int root)
{
priority_queue<P, vector<P>, greater<P>> que;
que.push({0, root});
//这里不要忘记初始化.
d[root] = 0;
vis2[root] = root;
while(que.size()){
auto p = que.top(); que.pop();
int u = p.y;
if(vis[u] == root) continue;
vis[u] = root;
dist[u][cal(root, u)] = d[u];
for(int i = h[u]; i != -1; i = ne[i]){
int v = e[i];
if(v < root) continue;
if(vis2[v] != root){
d[v] = INF;
vis2[v] = root;
}
if(d[v] > d[u] + w[i]){
d[v] = d[u] + w[i];
que.push({d[v], v});
}
}
}
}
int lca(int u, int v)
{
while(u != v){
if(u > v) u >>= 1;
else v >>= 1;
}
return u;
}
int Length(int u)
{
int cnt = 0;
while(u){
cnt++;
u >>= 1;
}
return cnt;
}
int main()
{
int n, m, q;
scanf("%d%d", &n, &m);
memset(dist, 0x3f, sizeof dist);
memset(h, -1, sizeof h);
for(int i = 1; i <= n; i++){
dist[i][0] = 0;
}
for(int i = 0; i < m; i++){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add(b, a, c), add(a, b, c);
}
scanf("%d", &q);
for(int i = 1; i <= n; i++){
dijkstra(i);
}
while(q--){
int s, t;
scanf("%d%d", &s, &t);
ll ans = INF;
int LA = lca(s, t);
//printf("*** %d %d %d\n", s, t, LA);
int l1 = Length(s) - Length(LA), l2 = Length(t) - Length(LA);
while(LA){
ans = min(ans, dist[s][l1] + dist[t][l2]);
LA >>= 1;
l1++, l2++;
}
if(ans == INF) printf("-1\n");
else printf("%lld\n", ans);
}
return 0;
}
#include
using namespace std;
typedef long long ll;
ll g(ll m, ll x)
{
return m / (m / x);
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
ll n, m;
scanf("%lld%lld", &n, &m);
if(m % n == 0){
printf("0\n");
}
else if(n > m){
printf("%lld\n", n - m);
}
else{
ll res = 1e9;
for(ll l = 1, r; l <= n; l = r + 1){
r = min(n, g(m - 1, l));
if(l <= n) res = min(res, (m - 1) / l * l);
//printf("%lld %lld\n", l, res);
}
printf("%lld\n", n - m + res);
}
}
return 0;
}