HDU 6690 Rikka with Segment Tree(递归)

HDU 6690 Rikka with Segment Tree(递归)
大佬博客题意可以从上面的博客中看题解也完全可以思路就是定义3个函数F , G , H F,G,HF,G,H他们都是关于长度为1 到 n 1到n1到n的线段树的某种答案的和。然后思考一下线段树分成两个线段树的过程就可以递归计算答案了。所以这个题的算法就是递归普及减难度对不起要熟练运用STL使用map所以应该是提高减#includebits/stdc.h#definemod 998244353#defineLL long longusingnamespacestd;mapLL,intf,g,h;intinv6(mod1)/6;intsolve(LL n){if(f.count(n))returng[n];if(n1)returnf[n]g[n]h[n]n;if(n1){LL un/2,vn-n/2;solve(u),solve(v);intfuf[u],fvf[v],huh[u],hvh[v],gug[u],gvg[v];f[n](3ll*fufv1ll*(n%mod)*(n%mod1)/2-1)%mod;h[n](6ll*hu2ll*hvfu-fv1ll*(n%mod)*(n%mod1)%mod*(2ll*n%mod1)%mod*inv6%mod-1)%mod;g[n](3ll*gugv2ll*hufu1ll*(n%mod)*(n%mod1)%mod*(n%mod2)%mod*inv6%mod-1)%mod;}else{LL un/2,vu-1;solve(u),solve(v);intfuf[u],fvf[v],huh[u],hvh[v],gug[u],gvg[v];f[n](3ll*fufv1ll*(n%mod)*(n%mod1)/2-1)%mod;h[n](6ll*hu2ll*hv-fufv1ll*(n%mod)*(n%mod1)%mod*(2ll*n%mod1)%mod*inv6%mod-1)%mod;g[n](3ll*gugvhuhvfv1ll*(n%mod)*(n%mod1)%mod*(n%mod2)%mod*inv6%mod-1)%mod;}returng[n];}intmain(){intT;for(scanf(%d,T);T--;){LL a,b;scanf(%lld%lld,a,b);printf(%d\n,((solve(b)-solve(a-1))%modmod)%mod);}}