萌新求助,自闭一天了还是爆炸
查看原帖
萌新求助,自闭一天了还是爆炸
98618
Provicy楼主2020/7/1 14:20

rt,只过了环的数据,自己造了好几个小数据手模和代码跑出来一样的,不知道是写挂了还是题意理解错了www

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#define ri register
#define inf 0x7fffffff
#define E (1)
#define mk make_pair
#define int long long
using namespace std; const int N=600010, Mod=19260817;
inline int read()
{
	int s=0, w=1; ri char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar(); return s*w;
}
void print(int x) {if(x<0) x=-x, putchar('-'); if(x>9) print(x/10); putchar(x%10+'0'); }
int n,head[N],maxE,book[N],h[N],hw[N],cnt,size[N],ans,rd;
struct Edge{int nxt,to,rdis; }e[N];
inline void Add(int u,int v,int w) {e[++maxE].nxt=head[u]; head[u]=maxE; e[maxE].to=v, e[maxE].rdis=w; }
int DFS(int x,int fa)
{
	if(book[x]) return x;
	else book[x]=-1;
	for(int i=head[x];i;i=e[i].nxt)
	{
		if(e[i].to==fa) continue;
		int tt=DFS(e[i].to,x);
		if(!tt) continue;
		h[++cnt]=x, hw[cnt]=e[i].rdis, book[x]=1;
		return tt^x?tt:0;
	}
	return 0;
}
void GetSize(int x,int fa)
{
	size[x]=1;
	for(int i=head[x];i;i=e[i].nxt)
	{
		if(e[i].to==fa||book[e[i].to]==1) continue;
		GetSize(e[i].to,x);
		size[x]+=size[e[i].to];
	}
}
void GetZS(int x,int fa)
{
	//printf("%lld\n",x);
	for(int i=head[x];i;i=e[i].nxt)
	{
		//printf("%lld %lld %lld\n",x,e[i].to,book[e[i].to]);
		if(e[i].to==fa||book[e[i].to]==1) continue;
		ans=(ans+e[i].rdis*size[e[i].to]%Mod*(n-size[e[i].to])%Mod*2%Mod)%Mod;
		GetZS(e[i].to,x);
	}
}
inline int ksc(int x,int p) { int res=1; for(;p;p>>=1, x=x*x%Mod) if(p&1ll) res=res*x%Mod; return res; }
signed main()
{
	n=read();
	for(ri int i=1;i<=n;i++)
	{
		int u,v,w;
		u=read(), v=read(), w=read();
		Add(u,v,w), Add(v,u,w);
	}
	DFS(1,-1);
	for(ri int i=1;i<=cnt;i++) GetSize(h[i],-1);
	//for(ri int i=1;i<=n;i++) printf("%lld ",book[i]); puts("");
	int wrs=0;
	for(ri int i=1;i<=cnt;i++) rd=(rd+(size[h[i]]-1)*(size[h[i]]-1)%Mod)%Mod, wrs+=hw[i], wrs%=Mod;
	rd=(n*n%Mod-rd+Mod)%Mod;
	ans=rd*wrs%Mod; printf("%lld\n",ans);ans=ans*ksc(2,Mod-2)%Mod; //printf("%lld\n",ans);
	for(ri int i=1;i<=cnt;i++) GetZS(h[i],-1); //printf("%lld\n",ans);
	printf("%lld\n",ans);
	printf("%lld\n",ans*ksc(n*n%Mod,Mod-2)%Mod);
	return 0;
}
/*
9
1 2 3
3 2 4
2 4 5
4 5 1
5 6 6
6 4 2
5 7 2
5 8 7
8 9 1
*/
2020/7/1 14:20
加载中...