2018 Wannafly summer camp Day3-- Travel (思维 组合数取模)

2024-03-12 08:50

本文主要是介绍2018 Wannafly summer camp Day3-- Travel (思维 组合数取模),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:https://www.nowcoder.com/acm/contest/203/H

题目大意:

       魔方国有n座城市,编号为。城市之间通过n-1条无向道路连接,形成一个树形结构。澜澜打算在魔方国进行m次旅游,每次游览至少一座城市。为了方便,每次旅游游览的城市必须是连通的。此外,澜澜希望游览所有城市恰好一次。
       澜澜想知道有多少种旅游方案满足条件,两个方案不同当且仅当存在某一次旅游游览了不同的城市。澜澜不会数数,所以只好让你来帮他数方案。

题解:

      第一次见到披着树形结构的外衣却与树完全不相干的题。

      首先给了n个点,n-1条边,那么肯定是一棵树。进行m次旅行,每个点都要经过且只能经过一次,那就是用m条边将n个点分为m段,这里就是隔板法的思想,划分数就是C_{n-1}^{m-1}(将n个点划分为m段,就是在n-1个空中插入m-1个板)。

----------------------------------------------------------------------------

      在网上也看了一些题解,都是一个版本的,感觉并没有说的很清楚。我认为本题应该是划分点而不是划分边,即划分n个点而不是n-1条边,因为并不一定所有点都在一条边上。

      比如这个图,将6个点的树划分为3段,那么左边那一段是不可能通过一次旅行来走完的。所以划分边不行,需要划分点。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#define mod 1000000007
using namespace std;
typedef long long ll;
#define maxn 1000010
int t, n, m, ta, tb;
ll c[maxn];
long long pow_mod(long long a,long long n,long long m)//a^n mod m
{long long res=1;while(n>0){if(n&1==1)res=res*a%m;a=a*a%m;n>>=1;}return res;
}
//记得在最后输出结果的时候再模m一次void init()//先打出阶乘,节省时间
{c[1] = 1;for (int i = 2; i <= maxn; i++)c[i] = c[i - 1] * i%mod;
}
ll C(ll n, ll m)
{return c[n] * pow_mod(c[m] * c[n - m] % mod, mod - 2, mod) % mod;
}
int main()
{init();int T,x,y;cin>>T;while(T--){cin>>n>>m;for(int i = 0; i < n - 1; i++)cin>>x>>y;if(m == 1){puts("1");continue;}ll ans = C(n, m);ans = (ans*c[m]) % mod;cout << ans << endl;}return 0;
}

 

这篇关于2018 Wannafly summer camp Day3-- Travel (思维 组合数取模)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800733

相关文章

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

Go组合

摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间使用匿名引入的方式实现对象属性方法的组合 组合使用注意项 使用匿名引入的方式来组合其他struct 默认优先调用外层方法 可以指定匿名struct以调用内层方法 代码 package mainimport ("fmt")type People struct{}type Pe

组合c(m,n)的计算方法

问题:求解组合数C(n,m),即从n个相同物品中取出m个的方案数,由于结果可能非常大,对结果模10007即可。       共四种方案。ps:注意使用限制。 方案1: 暴力求解,C(n,m)=n*(n-1)*...*(n-m+1)/m!,n<=15 ; int Combination(int n, int m) { const int M = 10007; int

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

颠覆你的开发模式:敏捷思维带来的无限可能

敏捷软件开发作为现代软件工程的重要方法论,强调快速响应变化和持续交付价值。通过灵活的开发模式和高效的团队协作,敏捷方法在应对动态变化和不确定性方面表现出色。本文将结合学习和分析,探讨系统变化对敏捷开发的影响、业务与技术的对齐以及敏捷方法如何在产品开发过程中处理持续变化和迭代。 系统变化对敏捷软件开发的影响 在敏捷软件开发中,系统变化的管理至关重要。系统变化可以是需求的改变、技术的升级、

INDEX+SMALL+IF+ROW函数组合使用解…

很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP、INDEX+MATCH中入门的,纵然你把全部的多条件查找方法都学会了而且运用娴熟,如VLOOKUP和&、SUMPRODUCT、LOOKUP(1,0/....,但仍然只能对这种一对多的查询望洋兴叹。   这里讲的INDEX+SMALL+IF+ROW的函数组合,

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C++方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述