【xdoj难题集】1116 Dominator Orz Pandas

原创 2018年04月17日 11:49:00

不知道为什么做的人很少,其实是一道思维题,想通了很简单,另外吐槽一下这道题坑人的m,竟然里面的重要城市可能会重复,这不是存心害人吗?我就不知道谁平常说话说有m个重要城市还能有重复的,当时没看见搞了我20分钟检查,真的坑。

并没有什么技术性难题,完全是思想,考虑一个重要城市,假如子树大小为k,那么会发现其实有这个城市相比于没有这个城市只是让答案除k了,为什么呢?因为如果没有这个城市,不管这个城市选什么值我们都会在后面的城市得到一系列的排列,而这些值都是等价的,所以这个城市选哪个值并不影响后面有多少个结果,那么如果有了这个城市,那么只有最大值在这个城市的时候才是对的,所以相比于没有限制,当然是结果除k了,所以初始情况n!种,再除以所有重要城市子树数量之积即可。数量的逆元和阶乘的模都可以o(n)打表得到(要有些技巧)。

贴代码

# include <stdio.h>
# include <string.h>
# include <vector>

using namespace std;

typedef long long ll;

const int MAX_N = 1e5 + 5;
const int Mod = 1e9 + 7; 

bool used[MAX_N];

vector<int> G[MAX_N];
int d[MAX_N];

ll jie[MAX_N + 1], ni[MAX_N + 1]; 
int N, M;

int dfs(int prv , int x)
{
	int ans = 1, i;
	for(i = 0 ; i < G[x].size() ; i++)
	{
		int t = G[x][i];
		if(t == prv)
			continue;
			
		ans += dfs(x , t);
	}
	
	return d[x] = ans;
}

void solve()
{
	dfs(-1 , 0);
	ll ans = jie[N];
	//printf("haha%d\n", d[0]);
	memset(used , 0 , sizeof(used));
	
	int i, c;
	for(i = 0 ; i < M ; i++)
	{
		scanf("%d", &c);
		c--;
		if(!used[c])
		{
			used[c] = 1;
			ans = ans * ni[d[c]] % Mod;
		}
	}
	
	printf("%lld\n", ans);
}

int main()
{
	jie[0] = jie[1] = 1;
	ni[0] = ni[1] = 1;
	
	int i;
	for(i = 2 ; i <= MAX_N ; i++)
		jie[i] = jie[i - 1] * i % Mod;
		
	for(i = 2 ; i <= MAX_N ; i++)
		ni[i] = ni[Mod % i] * (Mod - Mod / i) % Mod;
	
	//printf("%lld\n", 19261 * ni[19261] % Mod);
	
	while(~scanf("%d %d", &N, &M))
	{
		int i, t, s;
		for(i = 0 ; i < N - 1 ; i++)
		{
			scanf("%d %d", &t, &s);
			t--;
			s--;
			G[t].push_back(s);
			G[s].push_back(t);
		}
		
		solve();
		
		for(i = 0 ; i < N ; i++)
			G[i].clear();
	}
	
	return 0;
} 

【xdoj难题集】1092Puzzle V8

# include &amp;lt;stdio.h&amp;gt; # include &amp;lt;string.h&amp;gt; int box[5][8]; int N; bool kil...
  • qq_40772738
  • qq_40772738
  • 2018-04-08 23:45:26
  • 38

【xdoj难题集】前言

开这个主要目的是造福后人,有时候求索是非常费时而浪费的,之前做poj,看到丰富的discuss以及网上的大量讲解,让我有了这个打算。xdoj作为一个不错的题库,缺少一些对难题系统的讲解和提示,以至于这...
  • qq_40772738
  • qq_40772738
  • 2018-04-08 23:22:44
  • 15

【xdoj难题集】1067: P-Function

省赛题,不但是英文的而且有一定的难度。之前一直陷入冥思苦想,结果不知道为什么今天再看到的时候突然灵光一现,一下子就20分钟一遍秒杀了。所以说,对于找方法,找bug这种np问题,运气还是有点重要的。先分...
  • qq_40772738
  • qq_40772738
  • 2018-04-14 15:19:17
  • 9

2017.05.09回顾 pandas使用记录

1、给决策引擎P2做了一个伪接口方便测试,做完伪接口还剩1个多小时,我他妈干什么了呢?我怎么想不起了 2、下午主要就是思考Simon留下的那个问题,几乎思考了一下午,把结论写在了上次挖坑的地方 3...
  • strwolf
  • strwolf
  • 2017-05-10 11:02:56
  • 397

【xdoj难题集】1203 Happy to Eliminate

题点击打开链接又沉浸在了模运算的海洋中了。。。这个模运算真的太恶心了,有时候又神奇又复杂,还是经验不够丰富,导致了很多错误。在此我也得到一个教训,对于涉及模运算的问题,宁可写的复杂一些,难看一些,也不...
  • qq_40772738
  • qq_40772738
  • 2018-04-14 00:38:58
  • 12

【xdoj难题集】1202 The Offer - Lunatic

说实话2017年的校赛挺难的,最后三道都不简单,这道题一开始吓了我一大跳,想着如果用最短路算法,魔法阵怎么也要上千万条路径,不过之后看到海拔最高只有100之后总算是安心了。先说一说大体思路,首先肯定想...
  • qq_40772738
  • qq_40772738
  • 2018-04-10 23:48:58
  • 8

【xdoj难题集】1102 xry111挂灯笼

题目这道题虽然做对的不多,但是我倒是做的异常顺利,直接一遍过,感觉在经历了pfunction之后已经领悟了新一层的dp技巧。说说思路,就是dp递推,关键是掌握如何递推,首先考虑只有一个挂钩的情况,这时...
  • qq_40772738
  • qq_40772738
  • 2018-04-14 22:55:11
  • 7

【dominator tree】 Lengauer-Tarjan algorithm

题意:给定源点,求出源点到其他各点的关键点  Lengauer-Tarjan algorithm 按理说这也是个经典算法,跟lca的tarjan和强连通的tarjan都有极其相似之处,但是貌似并没有...
  • huyuncong
  • huyuncong
  • 2013-11-14 16:13:49
  • 2511

Lucas定理的应用

//此处暂时只到笔者目前接触过的题 Lucas定理适用于long long范围内(无法打表,且单次求时间较短)大整数组合数求模,且除数p不超过6位。使用时先写好板子,求C(n,m)时只需由函数luca...
  • wy_2016
  • wy_2016
  • 2016-10-11 22:28:35
  • 248

bzoj 3118: Orz the MST (单纯形)

3118: Orz the MST Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 236  Solved: 98 [Submit][Statu...
  • clover_hxy
  • clover_hxy
  • 2017-03-06 23:35:38
  • 250
收藏助手
不良信息举报
您举报文章:【xdoj难题集】1116 Dominator Orz Pandas
举报原因:
原因补充:

(最多只允许输入30个字)