这个题一看就是树剖的模型
但是有一些问题,比如权值的乘机太大了,可能会爆long long
一种解决的方法:我们考虑到,v<=10^18 所以最多经过60条大于1的边
对于权值为1的边我们可以用一个并查集合并(注意只会改小)
但是这种方法不好想,我们还是考虑树剖
若权值>=10^18 我们可以直接将其变为一个特殊的值(例如-1)表示“足够大”,这种情况直接输出0
若不够,我们有一个结论: [[a/b]/c] = [a/bc] 这个是显然的,所以可以将路径上的权值乘机求出并直接得到答案
CODE比较长但是比较好想(mul()这里做乘法的时候会爆long long ,一种方法是用除法,但是效率比较低所以用了int128)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
#define mid (l+r>>1)
#define LL __int128
#define M 1000000000000000000ll
using namespace std;
struct Edge{ int v,nt; LL c