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. 探索Redis设计与实现4:Redis内部数据结构详解——ziplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  2. HDU 6625 three arrays 求两个序列异或最小值的排列(一个可以推广的正解

    目录 题意: 解析 原题描述 字典树动态求Mex @(hdu 6625求两个序列异或最小值的排列) 题意: \(T(100)\)组,每组两个长度为\(n(100000)\)的排列,你可以将\(a[]\ ...

  3. 三种做法:BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster

    目录 题意 思路 AC_Code1 AC_Code2 AC_Code3 参考 @(bzoj 2780: [Spoj]8093 Sevenk Love Oimaster) 题意 链接:here 有\(n ...

  4. ARM系列处理器的分类

    1.ARM ARM即以英国ARM(Advanced RISC Machines)公司的内核芯片作为CPU,同时附加其他外围功能的嵌入式开发板,用以评估内核芯片的功能和研发各科技类企业的产品. ARM ...

  5. django 里面的更新数据(update)

    https://blog.csdn.net/qq_42606051/article/details/81162189 https://blog.csdn.net/luojie140/article/d ...

  6. Android 将drawable下的图片转换成bitmap、Drawable

    将drawable下的图片转换成bitmap . Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xxx ...

  7. sql server 与 oracle的区别(转)

    --1.数据类型不同.      --sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalld ...

  8. 【DRP】採用dom4j完毕XML文件导入数据库

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lantingxv_jing/article/details/37762523     xml文件在如 ...

  9. Red5文件结构简介

    Red5文件结构简介 Red5 是 支持Windows,Linux等多平台的RTMP流媒体服务器,最早属于谷歌下的开源项目,先已移植到Github,地址为https://github.com/Red5 ...

  10. jq 将translate的旋转角度转为数值

    // 将translate内的角度转为数值 function getmatrix(nowDeg){ var values = nowDeg.split('(')[1].split(')')[0].sp ...