hdu5378
2015-08-13 17:41
253 查看
关于逆元的相关知识已经总结到这里:求i模p的逆元中
还有关于这道题,在测试样例时,一直是错误的,最后才发现是求快速幂即ni函数时,其中的x没有设为long long int,谨记,虽然x乘完自己后或模上1000000007,但是还没模之前可能超过int的范围,但不会超过long long int的范围,所以要把x设为long long int。
不过关于这道题,嗯,用概率来求方法数,谁也限制不住人类的大脑啊!!!(今天学校停水,早晨没吃到牛肉馅的包子,中午懒在机房,所以吃了一天的面包,咸菜,不说了,说多了都是泪!!!我要吃肉!!!)
2015.8.29:
今天再次看着道题,一开始偷瞄到一点是通过概率求总共有多少种方法,但是死活也记不起到底该怎么求,依稀的记忆+推理得出是二维的dp,然后就死活就认准了dp[i][j]代表以i为根节点的子树中有j个minister,然后就只能朝着背包的方向去想了,最后感觉这样能做,但是不如原先的方法简单,虽然记不起原先的方法是什么了。然后打开题解,结果发现竟然看不懂了,在网上找题解,从新整理这道题,最后总算发现,不是智商问题,还算欣慰
。
题解中dp[i][j]代表1到i中有几个点在以它为根节点的子树中是最大的,那么相当于是前i个点中选择了j个让它成为以它为根节点的子树中最大的,并没有其它的含义了,不要再多想了,如果可以的话,想要冲着刚才的自己这样喊,然后递归就行了。
下面证明为什么在1到i中有j个是以它为根节点的子树中最大的,那么就只有j个minister:
首先,可以得知,这j个点必定是minister;
其次,假如说存在第j+1个minister,那么存在某个包括这个点的子树中这个点最大,任何一棵子树如果包括这个点的话,那么就肯定包括以这个点为根节点的那棵子树,所以在以这个点为根节点的子树中这个点也是最大的,与前面的假设,相违背,所以不可能存在第j+1个minister。
最后,没有最后。
还有关于这道题,在测试样例时,一直是错误的,最后才发现是求快速幂即ni函数时,其中的x没有设为long long int,谨记,虽然x乘完自己后或模上1000000007,但是还没模之前可能超过int的范围,但不会超过long long int的范围,所以要把x设为long long int。
不过关于这道题,嗯,用概率来求方法数,谁也限制不住人类的大脑啊!!!(今天学校停水,早晨没吃到牛肉馅的包子,中午懒在机房,所以吃了一天的面包,咸菜,不说了,说多了都是泪!!!我要吃肉!!!)
2015.8.29:
今天再次看着道题,一开始偷瞄到一点是通过概率求总共有多少种方法,但是死活也记不起到底该怎么求,依稀的记忆+推理得出是二维的dp,然后就死活就认准了dp[i][j]代表以i为根节点的子树中有j个minister,然后就只能朝着背包的方向去想了,最后感觉这样能做,但是不如原先的方法简单,虽然记不起原先的方法是什么了。然后打开题解,结果发现竟然看不懂了,在网上找题解,从新整理这道题,最后总算发现,不是智商问题,还算欣慰
。
题解中dp[i][j]代表1到i中有几个点在以它为根节点的子树中是最大的,那么相当于是前i个点中选择了j个让它成为以它为根节点的子树中最大的,并没有其它的含义了,不要再多想了,如果可以的话,想要冲着刚才的自己这样喊,然后递归就行了。
下面证明为什么在1到i中有j个是以它为根节点的子树中最大的,那么就只有j个minister:
首先,可以得知,这j个点必定是minister;
其次,假如说存在第j+1个minister,那么存在某个包括这个点的子树中这个点最大,任何一棵子树如果包括这个点的话,那么就肯定包括以这个点为根节点的那棵子树,所以在以这个点为根节点的子树中这个点也是最大的,与前面的假设,相违背,所以不可能存在第j+1个minister。
最后,没有最后。
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define N 1010 #define MOD 1000000007 long long int dp ; int siz ; int head ,to[2*N],nextedge[2*N]; int cou; long long int A ; void add(int a,int b){ to[cou]=b;nextedge[cou]=head[a];head[a]=cou++; } void dfs(int u,int fa){ siz[u]=1; for(int i=head[u];i!=-1;i=nextedge[i]){ int v=to[i]; if(v==fa){ continue; } else{ dfs(v,u); siz[u]+=siz[v]; } } return; } long long int ni(long long int x){ int y=MOD-2 ; long long int ans=1; while(y){ if(y%2){ ans=ans*x%MOD; } y=y/2; x=x*x%MOD; } return ans; } int main(){ int t; int n; int k; int a,b; A[0]=1; for(int i=1;i<N;i++){ A[i]=A[i-1]*i%MOD; } scanf("%d",&t); for(int cas=1;cas<=t;cas++){ scanf("%d%d",&n,&k); memset(head,-1,sizeof(head)); cou=0; for(int i=1;i<n;i++){ scanf("%d%d",&a,&b); add(a,b); add(b,a); } dfs(1,-1); memset(dp,0,sizeof(dp)); dp[1][1]=ni(siz[1]); dp[1][0]=(siz[1]-1)*dp[1][1]%MOD; for(int i=2;i<=n;i++){ long long int tempg=ni(siz[i]); dp[i][0]=dp[i-1][0]*(siz[i]-1)%MOD*tempg%MOD; for(int j=1;j<=i;j++){ dp[i][j]=(dp[i-1][j]*(siz[i]-1)%MOD*tempg%MOD+dp[i-1][j-1]*tempg%MOD)%MOD; } } printf("Case #%d: %d\n",cas,(A *dp [k]%MOD)); } return 0; }
相关文章推荐
- Spring MVC 之@RequestBody,@ResponseBody详解
- 斯坦福ML公开课笔记11——贝叶斯正则化、在线学习、ML应用建议
- IOS上 关于状态栏的相关设置(UIStatusBar)
- BMP文件格式详解
- js 语法
- MeteoInfoLab脚本示例:FY-3C全球火点HDF数据
- hdu5378
- 传说中的快排是怎样的
- Laravel SoapClient
- redis内核优化
- 微软官方常用系统工具合集
- VS 2008的64位编译环境的安装和使用
- IOS Using UIAlertView to show alerts
- 编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组
- ubuntu14.10配置静态IP中所遇到的DNS问题
- 直接插入排序
- 斯坦福ML公开课笔记10——VC维、模型选择、特征选择
- ios中json解析出现的null问题
- JavaScript--事件模型(转)
- hibernateTemplate获取jdbc数据库连接