[NOIP模拟15]题解
A.建设城市(city)
这容斥题多难啊你们是怎么考场切掉的啊
首先可以想一下,如果没有k的限制,这题怎么做?
相信你们肯定能看出来是挡板法裸题:m个物品分给n个人,每个人至少一个。
就是$C_{m-1}^{n-1}$呗。(如果每个人可以没有就是$C_{n+m-1}^{n-1}$)
但是就这玩意我考场都打了半个小时的表才推出来
上面这个柿子在这道题里可以表示为“至少有0个城市不满足条件的方案数”
显然范围太大了,里面不合法的情况要容斥掉。那么至少有一个的呢?
先选出一个城市,然后在建设队里选出k个先分给已经选出来的那个,再把剩下的建设队分给所有城市,每个城市至少一个。这样一定可以保证之前选出的那个不合法。所以方案数就是$C_n^1\times C_{m-k-1}^{n-1}$
之后同理,至少有i个城市不满足条件的方案数就是$C_n^i\times C_{m-i*k-1}^{n-1}$,枚举i逐步容斥奇减偶加即可。
#include<cstdio>
#include<iostream>
#include<cstring>
#define re register
using namespace std;
typedef long long ll;
const ll mod=;
const int N=1e7+;
ll n,m,K,fac[N];
ll qpow(ll a,ll b,ll mod)
{
ll res=;
a=a%mod;
while(b)
{
if(b&)res=res*a%mod;
a=a*a%mod;
b>>=;
}
return res;
}
ll C(ll x,ll y)
{
if(x<y)return ;
return fac[x]*qpow(fac[y],mod-,mod)%mod*qpow(fac[x-y],mod-,mod)%mod;
}
ll lucas(ll x,ll y)
{
if(!y)return ;
return C(x%mod,y%mod)*lucas(x/mod,y/mod)%mod;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&K);
if(n==m)
{
puts("");
return ;
}
if(n>m)
{
puts("");
return ;
}
fac[]=;
for(re int i=;i<=m;i++)
fac[i]=fac[i-]*1LL*i%mod;
ll ans=;
for(re int i=;i<=n;i++)
{
if(m-i*K-<=)break;
ll res=lucas(n,1LL*i)*lucas(m-1LL*i*K-1LL,n-1LL)%mod;
if(!(i&))ans+=res,ans%=mod;
else ans-=res,ans=(ans+mod)%mod;
}
cout<<ans<<endl;
return ;
}
B.轰炸行动
理解题意要正确,只要两个城市联通就不能一起炸,不管直接还是间接联通。
毕竟考场上像我一样理解对题意还不会做的垃圾太少了
如果没有环,显然答案就是图上最长链长度。因为一条链上每次一定只能炸一个点,不在一条链上的点可以并列炸。
有环也一样,直接缩点跑拓扑求最长链即可。注意此时更新每条链长度不是+1,而是+scc's size。
(现在想起来,我当时似乎也理解错题了,不过不是联通性。当时以为城市被炸了一次就废了原来连着它的边就断了,我真是yy能手23333)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch))x=x*+ch-'',ch=getchar();
return x*f;
}
const int N=;
int n,m;
int to[N<<],nxt[N<<],head[N],tot,ans[N];
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int dfn[N],low[N],st[N],vis[N],top,ind,scc,size[N],bel[N],deg[N],maxx[N];
vector<int> g[N];
void tarjan(int x)
{
dfn[x]=low[x]=++ind;
vis[x]=;st[++top]=x;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(!dfn[y])tarjan(y),low[x]=min(low[x],low[y]);
else if(vis[y])low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x])
{
scc++;int now=;
do
{
now=st[top--];
vis[now]=;
bel[now]=scc;
size[scc]++;
}
while(now!=x);
}
}
queue<int> q;
int main()
{
n=read(),m=read();
for(int i=;i<=m;i++)
{
int x=read(),y=read();
add(x,y);
}
for(int i=;i<=n;i++)
if(!dfn[i])tarjan(i);
for(int x=;x<=n;x++)
for(int i=head[x];i;i=nxt[i])
if(bel[to[i]]!=bel[x])
g[bel[x]].push_back(bel[to[i]]),deg[bel[to[i]]]++;
for(int i=;i<=scc;i++)
if(!deg[i])q.push(i),ans[i]=size[i];
while(!q.empty())
{
int x=q.front();
q.pop();int sz=g[x].size();
for(int i=;i<sz;i++)
{
int y=g[x][i];
ans[y]=max(ans[y],ans[x]+size[y]);
if(!(--deg[y]))q.push(y);
}
}
cout<<*max_element(ans+,ans++scc)<<endl;
return ;
}
C.石头剪刀布
这么好的题给我做真是焚琴煮鹤,弃了弃了。与其抄std还不如等撑过联赛再说。
[NOIP模拟15]题解的更多相关文章
- HZOJ 20190818 NOIP模拟24题解
T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- [NOIP模拟13]题解
A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...
- NOIP模拟 15
因为OJ停机,正好写(tui)个总结(boke) 题解不想写了. 前两题题意没看懂,其实比较简单. 最后一题神仙,想放弃. (迪神貌似又在疯狂骂自己) (我这么辣鸡我...) (下面开始跑题) 这两天 ...
- 8.3 NOIP 模拟12题解
话说这次考试T1和T2是真的水,然而T1CE,T2TLE,T3CE 这不就是在侮辱我的智商啊!之前本机编译都是c++,以后要用c++11. 这次的T1就是一个大型找规律,我的规律都找出来了,但是竟然用 ...
- 『7.5 NOIP模拟赛题解』
T1 Gift Description 人生赢家老王在网上认识了一个妹纸,然后妹纸的生日到了,为了表示自己的心 意,他决定送她礼物.可是她喜爱的东西特别多,然而他的钱数有限,因此他想 知道当他花一 ...
随机推荐
- 【Flutter学习】事件处理与通知之事件处理
一,概述 移动应用中一个必不可少的环节就是与用户的交互,在Flutter中提供的手势检测为GestureDetector. Flutter中的手势系统分为二层: 第一层是触摸原事件(指针) Point ...
- 【Tomcat】2.配置Tomcat服务器端口和HTTPS
1.修改XML配置文件 找到Tomcat安装目录下的conf文件夹,打开server.xml文件(可以用笔记本打开) 其中有几行代码如下 <Server port="8005" ...
- ajax图片上传,单个按钮实现选择图片和上传
//图片原件上传功能 function gosubmit(file, key) { var formData = new FormData($("#inputForm")[0]); ...
- 基于C#的波形显示控件的实现[转]
编者记: 09年暑假正好在学院实验室呆了一段时间,做了个完整的上位机软件(具体实现:根据下位机的指令,实现通过串口来操纵下位机进行实验,并将采集的数据进行处理和保存,并以图形的方式显示),整个项目边学 ...
- jupyter notebook的魔法命令 % %%
Magic单元分为两种,一种是line magics,另外一种cell magics. Line magic是通过在前面加%,表示magic只在本行有效. Cell magic是通过在前面加%%,表示 ...
- PAT甲级——A1145 HashingAverageSearchTime【25】
The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...
- token的创建及解析
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifac ...
- vue.js实现用户评论、登录、注册、及修改信息功能
vue.js实现用户评论.登录.注册.及修改信息功能:https://www.jb51.net/article/113799.htm
- [已解决]报错: TLS handshake timeout
为了永久性保留更改,您可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值. { "registry-mirrors": ...
- 面向对象&从这里开始我们将不再是纯小白
一.面向对象初识 1.1 面向过程编程vs函数式编程 我们在没有学习函数的时候,写的代码都是面向过程式编程 # 面向过程编程 测量对象的元素的个数. s1 = 'fjdsklafsjda' count ...