topcoder srm 700 div1 -3
1、有$n$个人,编号1到$n$。将其平均分到$m$个房间中,每个房间$K$个人。现在知道每个房间编号最小的人的编号。对于给出的人$x$。问其可能在的房间有多少种?
思路:先假设其在某个房间,然后判断可行否。将按照编号从大到小每个房间依次考虑。大于这个房间最小编号的人都可以在这里,多了就存起来。
#include <string.h>
#include <stdio.h>
#include <vector>
#include <string>
#include <set>
#include <algorithm>
#include <map>
using namespace std; const int N=55; class FindingFriend { public:
int find(int m,vector<int> a,int k) {
sort(a.begin(),a.end());
int n=a.size();
for(int i=0;i<n;++i) {
if(a[i]==k) return 1;
}
int b[1111];
for(int i=0;i<n;++i) {
if(i==n-1)
{
b[i]=n*m-a[i];
if(k>a[i]) --b[i];
}
else {
b[i]=a[i+1]-a[i]-1;
if(a[i]<k&&k<a[i+1]) --b[i];
}
}
--m;
int ans=0;
for(int i=0;i<n;++i) if(k>a[i]) {
int ok=1;
int tot=0;
++b[i];
for(int j=n-1;j>=0;--j) {
if(b[j]<m) {
if(m-b[j]>tot) {
ok=0; break;
}
tot-=m-b[j];
}
else if(b[j]>m) {
if(i==j) {
if(m==0) {
ok=0; break;
}
}
tot+=b[j]-m;
}
}
if(ok) ++ans;
--b[i];
}
return ans;
} };
2、
思路:把$f$函数看做树的边。最后的$k$个节点是一个闭包,即对于这个闭包中的任意一个节点$x$,$f(x)$也属于这个闭包。那么首先从选出$k$个节点,$C_{n}^{k}$。这$k$个节点组成闭包的方案数设为$s(k)$。假设现在知道了$s(k-1)$,那么对于第$k$个节点来说,要么自己是一个闭包,要么跟前$k-1$是一个闭包,所以$s(k)=(k-1)*s(k-1)+s(k-1)=k*s(k-1)$,所以$s(k)=k!$。
那么现在对于剩下的$n-k$个节点需要最后连接到选出的$k$个节点上。这里把选出的$k$ 个节点看做一棵树的树根,其余的$n-k$个节点加上树根现在有$n-k+1$个节点。其余的$n-k$个节点最后要连接到树根上。现在枚举连上树根的节点有$i$个,那么这$i$个节点最后连接到$k$个节点的方案数为$k^{i}$。而对于整个树来说,考虑它的prefer编码,由于树根上连上了$i$个节点,那么树根在最后的长度为$(n-k+1)-2$的prufer序列中出现了$i-1$次,所以有$C_{n-k-1}^{i-1}$种放置的方式,对于prufer序列的其余$(n-k-1)-(i-1)$个位置,每个位置可以放的节点种类为$n-k$,所以有$(n-k)^{n-k-i}$。所以答案为$C_{n}^{k}*k!*\sum_{i=1}^{n-k}k^{i}*C_{n-k-1}^{i-1}*(n-k)^{n-k-i}$。后半部分可以简化。
$\sum_{i=1}^{n-k}k^{i}*C_{n-k-1}^{i-1}*(n-k)^{n-k-i}$
$=\sum_{i=1}^{N}k^{i}*C_{N-1}^{i-1}*N^{N-i}$
$=k*\sum_{i=0}^{N-1}C_{N-1}^{i}*k^{i}*N^{N-1-i}$
$=k*(N+k)^{N-1}$
$=k*n^{n-k-1}$
#include <string.h>
#include <stdio.h>
#include <vector>
#include <string>
#include <set>
#include <algorithm>
#include <map>
using namespace std; const int N=5005;
const int mod=1000000007; int C[N][N]; long long exGcd(long long a,long long b,long long &x,long long &y)
{
long long r,t;
if(b==0)
{
x=1;
y=0;
return a;
}
r=exGcd(b,a%b,x,y);
t=x;
x=y;
y=t-a/b*y;
return r;
} long long inverse(long long a,long long m)
{
long long x,y;
exGcd(a,m,x,y);
return (m+x%m)%m;
} long long f(int n) {
long long ans=1;
for(int i=1;i<=n;++i) ans=ans*i%mod;
return ans;
} class CrazyFunctions { public:
int count(int n,int k) {
long long ans=f(n)*inverse(f(k)*f(n-k)%mod,mod)%mod;
for(int i=1;i<=k;++i) ans=ans*i%mod;
if(k<n) {
ans=ans*k%mod;
for(int i=0;i<n-k-1;++i) ans=ans*n%mod;
} return (int)ans;
} };
topcoder srm 700 div1 -3的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
- topcoder srm 575 div1
problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...
随机推荐
- mysql数据库表设计小数类型
float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效 ...
- 例子:动能并不是特别强(2-3)后,下M5的同时,也是恢复期到期的前一天
动能并不是特别强(2-3)后,下M5的同时,但是恢复期到期 EG.002195 2017/06/23-->2017/06/29
- c# Tuple新特性
class Operation { internal Tuple<int, int> FindMinMax(List<int> list) ...
- 总结我在huawei matebook D 2018版中安装archlinux的过程
1.首先当然是准备一个启动U盘.按理说UEFI启动方式,只要将ISO镜像中的文件copy到U盘根目录即可,可以实际用的时候虽然能启动,但是进入live的时候会有些问题,所以老老实实用UltraISO ...
- vss使用笔记
一.四大代码/文档管理软件 (1) git:具有PR(push request)特性,推送请求.需要负责人审核后才能推送.另外,在推送过程中,git会预编译(合并),分布式代码管理(客户端本地 ...
- [10]Windows内核情景分析---中断处理
中断处理 每个cpu有一张中断表,简称IDT. IDT的整体布局:[异常->空白->5系->硬](推荐采用7字口诀的方式重点记忆) 异常:前20个表项存放着各个异常的描述符(IDT表 ...
- [9]Windows内核情景分析 --- DPC
DPC不同APC,DPC的全名是'延迟过程调用'. DPC最初作用是设计为中断服务程序的一部分.因为每次触发中断,都会关中断,然后执行中断服务例程.由于关中断了,所以中断服务例程必须短小精悍,不能消耗 ...
- hdu1762 树的上的查询
2015-10-07 20:44:42 题意问的是给了一颗树,然后又1000000次查询u,v,问不在树路径上的点的编号最小值,以1为根 建这颗树,然后在同一棵子树中的点子让就输出1 否则我们记录每个 ...
- uva 12222 Mountain Road
题意: 有一个单行道,两个方向都有车在等待.给出每个车的方向以及到达的时间以及走完这段路所需要的时间. 为了防止车祸,同向两车通过任一点的时间间隔不得小于10s. 求最后一辆车离开时刻的最小值. 思路 ...
- 常对象与this指针
[1]示例代码 用代码说事,比较靠谱.请看下例: #include <QDebug> #include <QString> class Person { public: Per ...