题意:

  给出一个树,每条边上写了一个数字,给出一个P,求有多少条路径按顺序读出的数字可以被P整除。保证P与10互质。

分析:

  统计满足限制的路径,我们首先就想到了点分治。

  随后我们就需要考量,我们是否能统计过某个点的合法路径。我们看,由题目性质,我们可以求对于一个根,所有点到根的路径组成的数,以及根到所有点的路径所组成的数。然后我们就可以对前者开一个数组(其实是一个map容器),后者在上面查询,然后用点分治的去重套路,保证答案不重不漏。

代码:

 #include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=,inf=0x3f3f3f3f;
struct node{int y,z,nxt;}e[N*];int ans;
int sm,h[N],c=,vis[N],d[N],siz[N],mx[N];
int rt,n,m,pw[N],tot,dis[N];map<int,int>mp;
void add(int x,int y,int z){
e[++c]=(node){y,z,h[x]};h[x]=c;
e[++c]=(node){x,z,h[y]};h[y]=c;
} void getrt(int x,int fa){
siz[x]=;mx[x]=;
for(int i=h[x],y;i;i=e[i].nxt)
if((y=e[i].y)!=fa&&!vis[y]){
getrt(y,x);siz[x]+=siz[y];
mx[x]=max(mx[x],siz[y]);
} mx[x]=max(mx[x],sm-siz[x]);
if(mx[x]<mx[rt]) rt=x;return ;
} void exgcd(int a,int b,int &d,int &x,int &y){
if(!b) d=a,x=,y=;
else exgcd(b,a%b,d,y,x),y-=x*(a/b);
} int inv(int a,int p){
int x,y,d;exgcd(a,p,d,x,y);
return d==?(x%p+p)%p:-;
} void dfs(int x,int fa,int v1,int v2,int dep){
if(dep){
mp[v2%m]++;dis[++tot]=v1;d[tot]=dep;
} for(int i=h[x],y;i;i=e[i].nxt)
if((y=e[i].y)!=fa&&!vis[y]){
dfs(y,x,(v1*%m+e[i].z)%m,
(v2+e[i].z*pw[dep]%m)%m,dep+);
} return ;
} int calc(int x,int v,int op){
int res=;tot=;mp.clear();
dfs(x,,v,v,op);
for(int i=;i<=tot;i++){
int val=(m-dis[i]*inv(pw[d[i]],m)%m)%m;
if(mp.find(val)!=mp.end()) res+=mp[val];
if(!op) res+=(dis[i]==);
} if(!op) res+=mp[];return res;
} void solve(int x){
ans+=calc(x,,);vis[x]=;
for(int i=h[x],y;i;i=e[i].nxt)
if(!vis[y=e[i].y]){
ans-=calc(y,e[i].z,);
mx[rt=]=inf;sm=siz[y];
getrt(y,);solve(rt);
} return ;
} signed main(){
scanf("%lld%lld",&n,&m);
for(int i=,x,y,z;i<n;i++)
scanf("%lld%lld%lld",&x,&y,&z),
add(x+,y+,z);
pw[]=;for(int i=;i<=n;i++)
pw[i]=1ll*pw[i-]*%m;
mx[rt=]=inf;sm=n;
getrt(,);solve(rt);
printf("%lld\n",ans);
return ;
}

点分治

CF716E Digit Tree 点分治的更多相关文章

  1. CF 716E. Digit Tree [点分治]

    题意:一棵树,边上有一个个位数字,走一条路径会得到一个数字,求有多少路径得到的数字可以整除\(P\) 路径统计一般就是点分治了 \[ a*10^{deep} + b \ \equiv \pmod P\ ...

  2. 【Codeforces715C&716E】Digit Tree 数学 + 点分治

    C. Digit Tree time limit per test:3 seconds memory limit per test:256 megabytes input:standard input ...

  3. 【Codeforces 715C】Digit Tree(点分治)

    Description 程序员 ZS 有一棵树,它可以表示为 \(n\) 个顶点的无向连通图,顶点编号从 \(0\) 到 \(n-1\),它们之间有 \(n-1\) 条边.每条边上都有一个非零的数字. ...

  4. Codeforces 716 E Digit Tree

    E. Digit Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  5. 【题解】Digit Tree

    [题解]Digit Tree CodeForces - 716E 呵呵以为是数据结构题然后是淀粉质还行... 题目就是给你一颗有边权的树,问你有多少路径,把路径上的数字顺次写出来,是\(m\)的倍数. ...

  6. 【BZOJ-1468】Tree 树分治

    1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 534[Submit][Status][Discuss] ...

  7. HDU 4812 D Tree 树分治+逆元处理

    D Tree Problem Description   There is a skyscraping tree standing on the playground of Nanjing Unive ...

  8. POJ 1741 Tree 树分治

    Tree     Description Give a tree with n vertices,each edge has a length(positive integer less than 1 ...

  9. [bzoj 1468][poj 1741]Tree [点分治]

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

随机推荐

  1. shell初级-----数据呈现方式

    输入与输出 Linux系统将每个对象当作文件处理,这包括输入和输出进程.Linux用文件描述符来标识每个文件对象.文件描述符是一个非负整数,可以唯一标识会话中打开的文件.每个进程一次多可以有九个文件描 ...

  2. Androidstudio中添加jar包的方法

    在Androidstudio中添加一个jar包进去,怎么添加? 以下纯个人使用Androidstudio过程中的经验积累,要是有不足,望提出建议. 方法一: 先点击Androidstudio中的Pro ...

  3. C++语言中的static关键字的作用是什么?

    在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量.在模块 ...

  4. HDOJ4857【拓扑排序】

    首先 CLJ ORZ 这道题做了两次,第一次瞎搞... 第二次,好吧,骄傲地说水过... 题意:不说了: 思路: 题目默认是小的在前面,那么就是反向建图,每次排序拿大的出来: 第一次做的时候,我记得我 ...

  5. MYSQL性能调优与架构设计之select count(*)的思考

    select count(*)的思考 原文:MYSQL性能调优与架构设计   举例: 这里我们就拿一个看上去很简单的功能来分析一下. 需求:一个论坛帖子总量的统计 附加要求:实时更新 在很多人看来,这 ...

  6. PostgreSQL - psql的使用与退出

    PostgreSQL连接数据库的两种方式 PostgreSQL在安装时自带了pgAdmin和psql,pgAdmin是可视化工具,psql是命令行工具.虽然pgAdmin操作起来会更加直观简单,但是在 ...

  7. Git如何克隆Gitlab?Git本地仓库如何上传Gitlab?

    首先确保本机已经安装上Git,其次确认可以正常访问Gitlab服务器 环境: Git:Centos 7.x  192.168.126.138 Gitlab: Centos7.x 192.168.126 ...

  8. Java项目的命名规则

    Java类的命名规范如下: 1. 项目名全部小写 2. 包名全部小写 3. 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. 如:public class MyFirstClass{ ...

  9. solrJ的使用--覆盖创建索引,查询,删除索引【转自http://blog.sina.com.cn/s/blog_64ac3ab10100t3mq.html】

    package com.xzhe.common.search; import java.util.ArrayList; import java.util.Collection; import java ...

  10. Java_静态变量

    class c1c { private static int num = 0; private static double pi = 3.14; private double radius; priv ...