挖坑:CF712E

#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;
}

  

时间: 2024-10-09 10:00:14

挖坑:CF712E的相关文章

微信JSSDK分享--挖坑填坑之小结

最近参与微信服务号小项目的开发,关于微信分享,我是只知其功能,并没深入了解其中的弯弯道道.虽然项目中不是我负责微信分享这一块(因为我也不太会),但是团队在这个功能上,那可是说多了都是泪,耗费了超级多的时间:一句话就是加班加点的挖坑,制造解决不了的bug,然后加班加点的找问题所在,去解决.主要是我们对于微信分享这块的了解并不深入,没想到的太多. 当时一直分享不成功,我们前端一直以为是我们的js代码写的有问题,谁知道最大的问题是配置问题: 一.不再同一个服务号. 因为微信端,为了识别用户,每个用户针

iOS中手势的delaysTouchesBegan属性用法(挖坑)

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/css/cuteeditor.css);iOS中手势的delaysTouchesBegan属性用法(挖坑),布布扣,bubuko.com

Java 快速排序(挖坑+分治)

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod).该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤. 因此我的对快速排序作了进一步的说明:挖坑填数+分治法: 先来看实例

「深入Exchange 2013」00 挖坑立碑

终于下决心静下心写点啥了,就给大家聊聊Exchange 2013吧.争取能把自己理解的,从项目实际经验中学到的东西一点点写下来分享出来. 计划是从前端角色 - 后端角色 – UM 这样的路子,每周更新个2-3篇.最后有空再回头写写安装啊,EMS啊这些基本的东西.整个文章偏理论,适合做过一些Exchange项目后想补充理论知识的看客. 写的过程中,如果有疏漏,请不吝赐教,直接留言.难点不在于能否收集到这么多知识,而在于能否坚持:特写本文以示挖坑- 最后打个广告宣传一下新成立的教育机构: http:

挖坑#1——矩阵乘法

BZOJ1706: [usaco2007 Nov]relays 奶牛接力跑 BZOJ1898: [Zjoi2004]Swamp 沼泽鳄鱼 BZOJ2326: [HNOI2011]数学作业 BZOJ3204: [NOI2013] 矩阵游戏 BZOJ2875: [Noi2012]随机数生成器 BZOJ1009: [HNOI2008]GT考试 BZOJ3231: [Sdoi2008]递归数列 BZOJ1875: [SDOI2009]HH去散步 BZOJ2432: [Noi2011]兔农 BZOJ353

游戏是怎么赚钱的 - 聊聊挖坑

36氪 2016-03-01 曹政 游戏是怎么赚钱的这个文章,访问量最高转发最高赞赏最高的是第一篇,关于科普的内容,而越往深入写其实越难有传播效应,这也是很多大号的悲哀,你只能写一点浅薄的才可以具有更好的传播效果. 其实这里还存在一个逻辑,写的深入点,不懂的人不喜欢,懂得人其实也不喜欢,因为很多真正值钱的东西就是一些认识,你写出来了,其实他们只会嫌你多事. 好吧,闲话少说,今天这个文章不长,但是是游戏赚钱的一个深入话题,就是如何提高单位用户的付费额度,在行业内,有一个术语,叫做挖坑.说的难听点,

挖坑#3-----DP优化+CDQ分治+期望DP

1492: [NOI2007]货币兑换Cash 1176: [Balkan2007]Mokia 1452: [JSOI2009]Count 1563: [NOI2009]诗人小G tyvj1309  刷题的玖君 3036: 绿豆蛙的归宿 1076: [SCOI2008]奖励关 1415: [Noi2005]聪聪和可可 1444: [Jsoi2009]有趣的游戏 2337: [HNOI2011]XOR和路径 3586: 字符串生成器 记得还有的啊... 挖坑#3-----DP优化+CDQ分治+期望

成长系统的设计方法:如何“挖坑”,又不让玩家反感

原文地址:http://bbs.gameres.com/thread_330212.html 游戏类型:  设计类型:[系统/框架/思路/玩法] 成长系统的设计方法 目录 成长系统的设计方法.....................................1 一.坑的使用方式.........................................4 1.时效性..............................................4 2.获取方式......

[转]前人挖坑,后人填坑—如何把那些bug挖掘出来

当我们放下一个项目转投下一个时,手头的东西就要转交给他人处理,或者..不再有人处理,可代码还在那里,搞不好你就引用了别人的东西,保不准哪天别人的代码里就爆出了个大 bug,当然这里的“别人”也可能是 你!我们既不希望自己是受害者,更不希望自己是施害者. 写代码不免出点bug,没有人可以保证自己写的代码不出问题,而那些没有被挖掘出来的bug,便成了后来者哭笑不得的坑... 这段时间公司全面 https 改造,涉及到域名的迁移,域名的迁移不是 nginx 做个映射就完事儿了,还有各种代码的去 sch