Codeforces Round #588 (Div. 1) B. Kamil and Making a Stream
题目:
要求求出所有的f(u , v)之和, u是v的祖先节点, f(u , v)是__gcd(u , .... u1 , u2 ... v),__其中u1 , u2 ...... 是u到v路径的所有节点。
inputCopy
5
4 5 6 0 8
1 2
1 3
1 4
4 5
outputCopy
42
优雅的暴力:
性质:可以发现u->v路径上的点越多,gcd越小,也就是有单调性。
那么我们用vector存一下u到根节点的所有f()值,肯定是单调的。
这个地方可以用个小技巧,gcd个数不会很多,log级别的个数(具体为啥,可以查看一下gcd性质) , 所以会有很多重复的,就用vector> , 存一个gcd是多少, 这个gcd有多少个。
然后就暴力的从父亲节点身上,搞到了当前节点身上。
好优雅的暴力。
/*
*@author spnooyseed
*/
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#pragma GCC optimize(3 , "Ofast" , "inline")
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization("unroll-loops")
#include
#include
#include
#include
#include
#include