HDU4812
树分治 
求逆元请递推,不然会TLE 
开桶记录即可 
注意常数
# pragma comment(linker,"/STACK:102400000,102400000")
# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <algorithm>
# include <string.h>
# include <vector>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
IL ll Read(){
    RG char c = getchar(); RG ll x = 0, z = 1;
    for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
    for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - '0';
    return x * z;
}
const int MAXN(200010), INF(2147483647), P(1e6 + 3);
int n, cnt, fst[MAXN], to[MAXN], nxt[MAXN], w[MAXN], k, ansx, ansy;
int size[MAXN], rt, sz, mx[MAXN], vis[MAXN], inv[P], d[P], S[MAXN], top, T[P];
IL void Add(RG int u, RG int v){  nxt[cnt] = fst[u]; to[cnt] = v; fst[u] = cnt++;  }
IL void Getroot(RG int u, RG int fa){
    size[u] = 1; mx[u] = 0;
    for(RG int e = fst[u]; e != -1; e = nxt[e]){
        if(vis[to[e]] || to[e] == fa) continue;
        Getroot(to[e], u);
        size[u] += size[to[e]];
        mx[u] = max(mx[u], size[to[e]]);
    }
    mx[u] = max(mx[u], sz - size[u]);
    if(mx[u] < mx[rt]) rt = u;
}
IL void Getdeep(RG int u, RG int fa, RG int dis){
    d[u] = dis; S[++top] = u;
    for(RG int e = fst[u]; e != -1; e = nxt[e]){
        if(vis[to[e]] || to[e] == fa) continue;
        Getdeep(to[e], u, 1LL * dis * w[to[e]] % P);
    }
}
IL void Solve(RG int u){
    vis[u] = 1; T[1] = u;
    for(RG int e = fst[u]; e != -1; e = nxt[e]){
        if(vis[to[e]]) continue;
        top = 0; Getdeep(to[e], u, w[to[e]]);
        for(RG int i = 1; i <= top; i++){
            RG int x = S[i], y = d[x], z = 0;
            z = T[1LL * k * inv[1LL * y * w[u] % P] % P];
            if(!z) continue;
            if(x > z) swap(x, z);
            if(x < ansx || (x == ansx && z < ansy)) ansx = x, ansy = z;
        }
        for(RG int i = 1; i <= top; i++) if(!T[d[S[i]]] || S[i] < T[d[S[i]]]) T[d[S[i]]] = S[i];
    }
    for(RG int e = fst[u]; e != -1; e = nxt[e]){
        if(vis[to[e]]) continue;
        top = 0; Getdeep(to[e], u, w[to[e]]);
        for(RG int i = 1; i <= top; i++) T[d[S[i]]] = 0;
    }
    T[1] = 0;
    for(RG int e = fst[u]; e != -1; e = nxt[e]){
        if(vis[to[e]]) continue;
        rt = 0; sz = size[to[e]];
        Getroot(to[e], u);
        Solve(rt);
    }
}
int main(RG int argc, RG char* argv[]){
    mx[0] = INF; inv[1] = 1;
    for(RG int i = 2; i < P; i++) inv[i] = (1LL * (-(P / i)) * inv[P % i] % P + P) % P;
    while(scanf("%d%d", &n, &k) != EOF){
        Fill(fst, -1); Fill(vis, 0);
        rt = cnt = 0; sz = n; ansx = ansy = n + 1;
        for(RG int i = 1; i <= n; i++) w[i] = Read();
        for(RG int i = 1, u, v; i < n; i++) u = Read(), v = Read(), Add(u, v), Add(v, u);
        Getroot(1, 0); Solve(rt);
        if(ansx > n) puts("No solution");
        else printf("%d %d\n", ansx, ansy);
    }
    return 0;
}
HDU4812的更多相关文章
- HDU4812 D Tree(树的点分治)
		
题目大概说给一棵有点权的树,输出字典序最小的点对,使这两点间路径上点权的乘积模1000003的结果为k. 树的点分治搞了.因为是点权过根的两条路径的LCA会被重复统计,而注意到1000003是质数,所 ...
 - [HDU4812]D Tree
		
vjudge 题意:给一棵树,每个点上有一个权值,求一条路径使得路径上权值的乘积膜\(10^6+3\)的结果为\(K\),输出路径的两个端点\(x,y\).如有多解,设\(x<y\),输出\(x ...
 - hdu4812 逆元+树分治
		
逆元链接:https://www.cnblogs.com/zzqc/p/7192436.html 经典的树分治题 #pragma comment("linker,"/STACK:1 ...
 - HDU4812 D tree  【点分治 + 乘法逆元】
		
D树 时间限制:10000/5000 MS(Java / Others)内存限制:102400/102400 K(Java / Others) 总共提交5400个已接受的提交1144 问题描述 南京理 ...
 - 【点分治】【乘法逆元】hdu4812 D Tree
		
思路比较裸,但是要把答案存到哈希表里面,这里需要一定技巧,否则会被K=1且点权全是1的数据卡飞.预处理乘法逆元.TLE了一天.换了种点分治的姿势…… #pragma comment(linker,&q ...
 - [hdu4812]D Tree(点分治)
		
题意:问有多少条路径,符合路径上所有节点的权值乘积模1000003等于k. 解题关键:预处理阶乘逆元,然后通过hash和树形dp$O(1)$的判定乘积存在问题,注意此道题是如何处理路径保证不重复的,具 ...
 - #YCB#待做题目与填坑资料
		
各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...
 - Noip前的大抱佛脚----赛前任务
		
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
 - D Tree HDU - 4812
		
https://vjudge.net/problem/HDU-4812 点分就没一道不卡常的? 卡常记录: 1.求逆元忘开longlong 2.把solve中分离各个子树的方法,由“一开始全部加入,处 ...
 
随机推荐
- youtube视频字幕下载
			
视频下载 安装TamperMonkey插件 字幕下载 http://mo.dbxdb.com/setting.html https://zhuwei.me/y2b/
 - Nginx的try_files指令和命名location使用实例
			
Nginx的配置语法灵活,可控制度非常高.在0.7以后的版本中加入了一个try_files指令,配合命名location,可以部分替代原本常用的rewrite配置方式,提高解析效率. 下面是一个使用实 ...
 - mysql 修改默认字符集为utf8
			
MySQL 5.5, all you need is: [mysqld] character_set_client=utf8 character_set_server=utf8 collation_s ...
 - MySQL中的内置系统函数
			
一.字符串函数 1. CONCAT(S1,S2....SN): 把传入的参数连接成一个字符串 2. INSERT(str, x, y, insert): 将字符串 X位置开始,y个字符串长度替换为 ...
 - apache服务器主域名跳转www域名
			
为集中网站权重,有时候我们需要把www域名跳转到主域名,或者主域名跳转到www域名. apache服务器如何实现主域名跳转www域名: 打开网站根目录下.htaccess文件,没有的话新建一个上传至网 ...
 - 记录一则fsck的简单案例
			
环境:RHEL 6.5 + ext4文件系统 我个人实验环境的一个虚拟机,开机时在Checking filesystems时,有报错: /dev/mapper/vg_linuxbase-lv_root ...
 - Python基础——数据类型与基本运算【主要为除法】
			
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ 无论是Python 3.x版本还是2.x版本,Python均支持多种数据类型,能够直接处理的数据类型包括Int类型. ...
 - linux 下安装php curl扩展
			
方法一 安装cURL wget https://curl.haxx.se/download/curl-7.53.1.tar.gz tar -zxf curl-7.17.1.tar.gz ./confi ...
 - 巧用Dictionary<TKey,TValue>,完成客户需求
			
前几天与客户沟通一个项目,客户对其中某个模块提了一个需求. 把从数据库中取出的对物品的统计重新拆分重新统计.鉴于用文字不能清除的表达需求,我将该需求画出来,便于理解. 需求如下图: 就是A,B,C D ...
 - AC Dream1069
			
这题的加密字符 - (Fibnacci % 26),如果得到的字符小于'a',就等于加密字符 - (Fibnacci % 26)+26. 获得题目的函数如下: void getItem(){ char ...