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]题解的更多相关文章

  1. HZOJ 20190818 NOIP模拟24题解

    T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...

  2. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  3. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  4. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  5. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  6. [NOIP模拟13]题解

    A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...

  7. NOIP模拟 15

    因为OJ停机,正好写(tui)个总结(boke) 题解不想写了. 前两题题意没看懂,其实比较简单. 最后一题神仙,想放弃. (迪神貌似又在疯狂骂自己) (我这么辣鸡我...) (下面开始跑题) 这两天 ...

  8. 8.3 NOIP 模拟12题解

    话说这次考试T1和T2是真的水,然而T1CE,T2TLE,T3CE 这不就是在侮辱我的智商啊!之前本机编译都是c++,以后要用c++11. 这次的T1就是一个大型找规律,我的规律都找出来了,但是竟然用 ...

  9. 『7.5 NOIP模拟赛题解』

    T1 Gift Description ​ 人生赢家老王在网上认识了一个妹纸,然后妹纸的生日到了,为了表示自己的心 意,他决定送她礼物.可是她喜爱的东西特别多,然而他的钱数有限,因此他想 知道当他花一 ...

随机推荐

  1. 使用JAVA如何对图片进行格式检查以及安全检查处理

    一.通常情况下,验证一个文件是否图片,可以通过以下三种方式: 1).判断文件的扩展名是否是要求的图片扩展名 这种判断是用得比较多的一种方式,不过这种方式非常的不妥,别人稍微的把一个不是图片的文件的扩展 ...

  2. OC学习篇之---@property和@synthesize的使用

    在之前一片文章我们介绍了OC中的内存管理:http://blog.csdn.net/jiangwei0910410003/article/details/41924683,今天我们来介绍两个关键字的使 ...

  3. Cisco基础(六):配置目前网络环境、项目阶段练习

    一.配置目前网络环境 目标: 一家新创建的IT公司,公司位于北京有80多台服务器 目前网络环境使用技术,通过端口映射技术将web服务器发布给Internet: 三层交换:汇聚接入层交换机 默认路由:实 ...

  4. AcWing 234. 放弃测试 (01分数规划)打卡

    题目:https://www.acwing.com/problem/content/236/ 题意:给你一个方程,可以有k个不选,要求最优 思路:看了一下这个方程就知道是01分数规划的模板题,它可以选 ...

  5. Python之-异常处理

    1.python中处理异常的方式 #coding:utf8 filename=raw_input("请输入你要操作的文件") try: f=open(filename) print ...

  6. webpack4.16压缩打包

    webpack4.16压缩打包 本文所用插件版本如下: nodejs:v8.11.3; npm:5.6.0 webpack:4.16 webpack的更新速度很快,差不多几个月就会出一版,最新的4系列 ...

  7. (转)使用OpenGL ES显示图像

    编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/index.html 转:http://hukai.me/and ...

  8. python基础三(深浅拷贝)

    1.赋值操作 list_1 = [1,2,3,['barry','Jerry']] list_2 = list_1 list_1[0] = 111 print(list_1) # [111, 2, 3 ...

  9. 当前系统的CPU和内存的空闲百分比

    设想我们有一个php页面A比较耗资源,因此在每次执行页面A中的代码前需要检测一下系统目前CPU和内存的空闲百分比.我们可以利用下面几个函数来解决这个问题 1 2 3 4 5 6 7 8 9 10 11 ...

  10. 二.通过jenkins对系统的监控(1)

    说明:通过jenkins定时请求系统,判断系统是否挂了. 注:windows环境 1.新建一个自由风格的项目. 2.构建触发器选择定时构建. 3.执行windows批处理命令 4.构建后操作,发邮件 ...