#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000005
using namespace std;
int n,m,tot,sum,root,top,stack[maxn][2],h[maxn],way[maxn*2],Next[maxn*2],w[maxn*2],size[maxn],power_10[maxn],ni[maxn];
long long ans;
bool v[maxn];
int read(){
int x=0,f=1;char ch;
for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct Hash{
#define mod 555616
int cnt,head[mod],fuck[maxn],val[maxn],num[maxn];
void clear(int x){head[x%mod]=0;}
void insert(int x){
for(int i=head[x%mod];i;i=fuck[i])if(val[i]==x){num[i]++;return;}
++cnt;val[cnt]=x;fuck[cnt]=head[x%mod];head[x%mod]=cnt;num[cnt]=1;
}
int find(int x){
for(int i=head[x%mod];i;i=fuck[i])if(val[i]==x)return num[i];
return 0;
}
}hash;
void insert(int x,int y,int z){way[++tot]=y;Next[tot]=h[x];h[x]=tot;w[tot]=z;}
void exgcd(int a,int b,int &x,int &y){
if(b==0){x=1;y=0;return;}
int tx,ty;exgcd(b,a%b,tx,ty);
x=ty;y=tx-a/b*ty;
}
int getni(){
int x,y;exgcd(10,m,x,y);
x=(x%m+m)%m;return x;
}
void getroot(int x,int fa){
size[x]=1;int pps=0;
for(int j=h[x];j;j=Next[j])if(way[j]!=fa&&!v[way[j]]){
getroot(way[j],x);size[x]+=size[way[j]];pps=max(pps,size[way[j]]);
}
if(max(pps,sum-size[x])<=sum/2)root=x;
}
void reverse(){for(int i=1;i<=top/2;i++)swap(stack[i][0],stack[top-i+1][0]),swap(stack[i][1],stack[top-i+1][1]);}
void calc(int x,int fa,int len,int num){
ans+=hash.find((1LL*(-num)*ni[len]%m+m)%m);
for(int j=h[x];j;j=Next[j])if(way[j]!=fa&&!v[way[j]])calc(way[j],x,len+1,(1LL*num*10+w[j])%m);
}
void change(int x,int fa,int len,int num,int op){
if(op)hash.insert(num);else hash.clear(num);
for(int j=h[x];j;j=Next[j])if(way[j]!=fa&&!v[way[j]])change(way[j],x,len+1,(1LL*w[j]*power_10[len]+num)%m,op);
}
void calc(int x,int op){
if(op)hash.insert(0);
for(int i=1;i<=top;i++)calc(stack[i][0],x,1,stack[i][1]),change(stack[i][0],x,1,stack[i][1],1);
if(op)ans+=hash.find(0)-1,hash.clear(0);
for(int i=1;i<=top;i++)change(stack[i][0],x,1,stack[i][1],0);
}
void work(int x,int s){
top=0;v[x]=1;
for(int j=h[x];j;j=Next[j])if(!v[way[j]])++top,stack[top][0]=way[j],stack[top][1]=w[j];
calc(x,1);reverse();calc(x,0);
for(int j=h[x];j;j=Next[j])if(!v[way[j]]){
sum=size[way[j]]>size[x]?s-size[x]:size[way[j]];
getroot(way[j],x);work(root,sum);
}
}
int main(){
n=read();m=read();
power_10[0]=ni[0]=1;
for(int i=1,j=getni();i<=n;i++)power_10[i]=1LL*power_10[i-1]*10%m,ni[i]=1LL*ni[i-1]*j%m;
for(int i=1,x,y,z;i<n;i++){
x=read();y=read();z=read()%m;
insert(x,y,z);insert(y,x,z);
}
sum=n;getroot(0,-1);work(root,sum);
printf("%lld\n",ans);
return 0;
}

  

挖坑:CF712E的更多相关文章

  1. windows的ReactNative挖坑一分钟爬坑一小时

    其实开发并不需要Android Studio来开发,因为命令行都是要自己手打的,所以就开始了我的挖坑爬坑之旅 首先安装React Native要用到的git.nodejs等等这里不讲了,主要讲在手机上 ...

  2. Saku实力挖坑记!!(十八)

    Saiku实力挖坑记!!!!!!! 我可真真真的是个挖坑小能手呀!不知道你们有没有遇到过这个异常: Enclosure class mondrian.olap.MondrianDef not foun ...

  3. 使用java实现快速排序(挖坑填数法和指针交换法)

    快速排序:通过一趟排序,将数据分为两部分,其中一部分中的所有数据比另外一部分的所有数据要小,然后按照此方法,分别对这两部分进行排序,达到最终的排序结果. 每趟排序选取基准元素,比该基准元素大的数据放在 ...

  4. 【Python】远离 Python 最差实践,避免挖坑

    原文链接:http://blog.guoyb.com/2016/12/03/bad-py-style/ 最近在看一些陈年老系统,其中有一些不好的代码习惯遗留下来的坑:加上最近自己也写了一段烂代码导致服 ...

  5. Executors 挖坑

    Executors 挖坑 线程频繁的创建销毁是有代价的,所以Java为我们提供了线程池 线程池构造方法很多 我们一般使用Executors的工厂方法: public static ExecutorSe ...

  6. 【挖坑】2019年JAVA安全总结:SQL注入——新项目的开发与老项目的修复

    如何在项目中有效的防止SQL注入 写给需要的人,所有的问题源自我们的不重视. 本章略过"什么是SQL注入","如何去利用SQL注入"的讲解,仅讲如何去防御 PS ...

  7. 布隆过滤器(Bloom Filter)-学习笔记-Java版代码(挖坑ing)

    布隆过滤器解决"面试题: 如何建立一个十亿级别的哈希表,限制内存空间" "如何快速查询一个10亿大小的集合中的元素是否存在" 如题 布隆过滤器确实很神奇, 简单 ...

  8. 深度挖坑:从数据角度看人脸识别中Feature Normalization,Weight Normalization以及Triplet的作用

    深度挖坑:从数据角度看人脸识别中Feature Normalization,Weight Normalization以及Triplet的作用 周翼南 北京大学 工学硕士 373 人赞同了该文章 基于深 ...

  9. Angular 从入坑到挖坑 - 组件食用指南

    一.Overview angular 入坑记录的笔记第二篇,介绍组件中的相关概念,以及如何在 angular 中通过使用组件来完成系统功能的实现 对应官方文档地址: 显示数据 模板语法 用户输入 组件 ...

随机推荐

  1. KMP算法简单回顾

    前言 虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于KMP串匹配的东西,一方面向伟人致敬,另一方面也是练练手,头脑风暴.我在自娱自乐,路过的朋友别太认 ...

  2. Cocos2d-x 3.1.1开发环境

    Windows7上搭建Cocos2d-x 3.1.1开发环境   前言 现在,越来越多的公司采用Cocos2d-x 3.0来开发游戏了,但是现在这样的文章并不多,所以打算写一系列来帮助初学者快速掌握C ...

  3. Akka入门实例

    Akka入门实例 Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用. Actor模型并非什么新鲜事物,它由Carl Hew ...

  4. 我的Mac应用

    笔记内容 我的Mac软件 用Mac已经2年+,主要用来看电影.听音乐.写日记,其实也是因为偶像uSi在用,选择Mac不仅仅是因为Mac编程特别好用,更是一种生活方式 办公软件 iWork超爱iWork ...

  5. C# STA和MTA线程设置

    参考资料: http://www.yesky.com/20010207/158097.shtml http://www.ftponline.com/china/XmlFile.aspx?ID=242 ...

  6. CMStepCounter Class Refernce

    CMStepCounter Class Refernce https://developer.apple.com/library/ios/documentation/CoreMotion/Refere ...

  7. MVC视图与控制器分离简单描述

    一,控制器 CheckIndexAreaRegistration.cs public class CheckIndexAreaRegistration : AreaRegistration { pub ...

  8. 两种高性能 I/O 设计模式 Reactor 和 Proactor

    两种高性能 I/O 设计模式 Reactor 和 Proactor Reactor 和 Proactor 是基于事件驱动,在网络编程中经常用到两种设计模式. 曾经在一个项目中用到了网络库 libeve ...

  9. nginx-push-stream模块源码学习(三)——发布

    一.概述     发布:发布者将MSG post到某一特定通道上,channel将信息缓存 在说明发布流程之前有必要说明下channel和msg的数据结构. 二.数据结构 2.1 MSG     发布 ...

  10. jquery animate stop函数解析

    今天我们来看看jquery中动画操作的stop函数.其实我至今不是很明白啊,所以此文算是求救以及抛砖引玉. 在jquery 1.7版本以前,stop支持两个参数,分别是clearQueue和jumpT ...