XJOI contest 1590
首先
热烈庆祝“CSP-S 2020全国开放赛前冲刺模拟训练题1”圆满结束!!!
感谢大毒瘤周指导的题目。题目还是很不错的,部分分设置的也比较合理,各种神仙随便 \(\text{AK}\) ,蒟蒻只能大呼 \(\text{NB}\) 。
Problem A
这是一道数学题。
根据周指导的题解中说明,这是一道数竞题目,但是由于我们是信竞,所以直接打一个暴力然后大胆的猜想一下就可以了。
发现这个数只能是 \(130\) 。
具体证明贴一下:

Problem B
这是一道神笔题。
我在考场上写了一个暴搜就可以过了。正解是构造 \(2\) 和 \(3\) 进制的格雷码。
所以暴搜不香吗?
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=15,MAXN=6e4+5;
int n,m,d,maxn;
struct Data{int loc[N];};
bool operator < (const Data a,const Data b)
{
for(int i=1;i<=n;++i)
if(a.loc[i]!=b.loc[i])
return a.loc[i]<b.loc[i];
return false;
}
map<Data,bool> mp;
Data way[MAXN];
bool dfs1(Data tmp,int now)
{
if(now>=maxn)
{
for(int i=1;i<=maxn;++i)
{
for(int j=1;j<=n;++j)
printf("%d ",way[i].loc[j]);
printf("\n");
}
return true;
}
Data smp;
for(int i=1;i<=n;++i)
{
smp=tmp,smp.loc[i]++;
if(smp.loc[i]<m&&!mp[smp])
{
mp[smp]=true,way[now+1]=smp;
if(dfs1(smp,now+1)) return true;
mp[smp]=false;
}
smp=tmp,smp.loc[i]--;
if(smp.loc[i]>=0&&!mp[smp])
{
mp[smp]=true,way[now+1]=smp;
if(dfs1(smp,now+1)) return true;
mp[smp]=false;
}
}
return false;
}
void subtask1()
{
Data tmp;
for(int i=1;i<=n;++i) tmp.loc[i]=0;
mp[tmp]=true,way[1]=tmp;
dfs1(tmp,1);
}
bool dfs2(Data tmp[],int l,int r,int now)
{
if(now>=maxn)
{
for(int i=1;i<=maxn;++i)
{
for(int j=1;j<=n;++j)
printf("%d ",way[i].loc[j]);
printf("\n");
}
return true;
}
Data smp[2];int L=l,R=r;
if(now%2) R--;
else L++;
smp[(now%2)^1]=tmp[(now%2)^1];
for(int i=1;i<=n;++i)
{
smp[now%2]=tmp[now%2],smp[now%2].loc[i]++;
if(smp[now%2].loc[i]<m&&!mp[smp[now%2]])
{
mp[smp[now%2]]=true;
if(now%2) way[R]=smp[now%2];
else way[L]=smp[now%2];
if(dfs2(smp,L,R,now+1)) return true;
mp[smp[now%2]]=false;
}
smp[now%2]=tmp[now%2],smp[now%2].loc[i]--;
if(smp[now%2].loc[i]>=0&&!mp[smp[now%2]])
{
mp[smp[now%2]]=true;
if(now%2) way[R]=smp[now%2];
else way[L]=smp[now%2];
if(dfs2(smp,L,R,now+1)) return true;
mp[smp[now%2]]=false;
}
}
return false;
}
void subtask2()
{
Data tmp[2];
for(int i=1;i<=n;++i) tmp[0].loc[i]=0;
mp[tmp[0]]=true,way[1]=tmp[0];
for(int i=1;i<=n;++i) tmp[1].loc[i]=m-1;
mp[tmp[1]]=true,way[maxn]=tmp[1];
dfs2(tmp,1,maxn,2);
}
int main()
{
// freopen("B.in","r",stdin);
// freopen("B.out","w",stdout);
cin>>n>>m>>d,maxn=pow(m,n);
if(n<=6||m==2) subtask1();
else subtask2();
return 0;
}
Problem C
这是一道结论题。
如果有度数小于等于3的点,就删掉这个点(和与它相关的边),先对于剩下的图构造一种方案,然后将这个点染成与他相邻的点中出现较少的颜色。
然后你发现用这个方法是可以直接过的,所以题目必定有解。
证明这个贪心周指导的题解里也很详细,贴一下:

然后在考场上有各种神仙用奇怪的随机化贪心过去了,还有什么先 \(\text{DFS}\) 再 \(\text{BFS}\) 的神仙。我乱搞能力还是太弱……
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=2e5+5;
int n,m;
//map<pair<int,int>,bool> mp;
struct Edge{int nxt,to;}e[M<<1];int fir[N];
void add(int u,int v,int i){e[i]=(Edge){fir[u],v},fir[u]=i;}
int deg[N],clr[N];
bool tag[N];
queue<int> q;
vector<int> ord;
int main()
{
cin>>n>>m;
for(int i=1,u,v;i<=m;++i)
{
scanf("%d%d",&u,&v);
// if(mp[make_pair(u,v)]) continue;
// mp[make_pair(u,v)]=mp[make_pair(v,u)]=true;
add(u,v,i<<1),add(v,u,i<<1|1);
deg[u]++,deg[v]++;
}
for(int i=1;i<=n;++i)
if(deg[i]<=3) q.push(i),tag[i]=true;
while(!q.empty())
{
int tmp=q.front();q.pop();
ord.push_back(tmp);//updata
for(int i=fir[tmp];i;i=e[i].nxt)
{
deg[e[i].to]--;
if(deg[e[i].to]<=3&&!tag[e[i].to])
q.push(e[i].to),tag[e[i].to]=true;
}
}
for(int i=ord.size()-1;i>=0;--i)
{
int cnt1=0,cnt2=0;
for(int j=fir[ord[i]];j;j=e[j].nxt)
cnt1+=(clr[e[j].to]==1),cnt2+=(clr[e[j].to]==2);
if(cnt1<cnt2) clr[ord[i]]=1;
else clr[ord[i]]=2;
}
for(int i=1;i<=n;++i) printf("%d ",clr[i]);
printf("\n");
return 0;
}
Problem D
这是一道套路题。
我考场上的思路是这样的,考虑我们对于一个合法的序列,如果我们交换其中两行或者两列的位置,他肯定是依旧合法的。
然后我大胆的猜测,所有的合法序列最终都一定可以变成左上方都是黑色,右下方都是白色的方案。然后我举了几个合法序列发现都对了……
然后题目就变成了问你对于所有用一条路径分割开整个矩形的方案数同时去除其中的可交换项的重复计数后的总方案数。
然后写了一个 \(O(n^3)\) 的 \(\text{DP}\) 。但是由于忘记预处理逆元了,挂了 \(20pts\) 。
考完发现自己结论是猜对的,证明贴一下:

然后发现这个东西就是斯特林数乘上一个阶乘,是可以 \(O(n^2)\) 求的(虽然我现在还不是很会)。然后用一个多项式乘法就可以满分了(我不会)。
\(70pts\) 代码如下;
#include<bits/stdc++.h>
using namespace std;
#define Lint long long
const int N=2005;
const Lint MOD=998244353;
int n,m;
Lint fac[N];
Lint f[N][N][2];
Lint sum[N][N][2];
inline int ksm(Lint x,int k)
{
Lint res=1;
for(;k;k>>=1,x=x*x%MOD)
if(k&1)res=res*x%MOD;
return res;
}
int main()
{
cin>>n>>m,fac[0]=1;
for(int i=1;i<=max(n,m);++i) fac[i]=fac[i-1]*i%MOD;
f[0][0][0]=f[0][0][1]=fac[n]*fac[m]%MOD;
for(int i=1;i<=max(n,m);++i) fac[i]=ksm(fac[i],MOD-2);
for(int i=0;i<=n;++i)
{
for(int j=0;j<=m;++j)
{
for(int k=0;k<i;++k)
f[i][j][0]+=f[k][j][1]*fac[i-k]%MOD,f[i][j][0]%=MOD;
for(int k=0;k<j;++k)
f[i][j][1]+=f[i][k][0]*fac[j-k]%MOD,f[i][j][1]%=MOD;
// printf("%d %d %lld %lld\n",i,j,f[i][j][0],f[i][j][1]);
}
}
printf("%lld\n",(f[n][m][0]+f[n][m][1])%MOD);
return 0;
}
XJOI contest 1590的更多相关文章
- XJOI contest 1592
首先 热烈庆祝"CSP-S 2020全国开放赛前冲刺模拟训练题2"圆满结束!!! 感谢大毒瘤颗粒囊的题目.题目还是很不错的,部分分设置的不合理,各种神仙随便 AK ,蒟蒻只能爆零. ...
- XJOI 3578 排列交换/AtCoder beginner contest 097D equal (并查集)
题目描述: 你有一个1到N的排列P1,P2,P3...PN,还有M对数(x1,y1),(x2,y2),....,(xM,yM),现在你可以选取任意对数,每对数可以选取任意次,然后对选择的某对数(xi, ...
- [contest 781] 9.6
[contest 781] 9.6 - XJOI czx的温暖题... T1 军训
- [contest 782] 9.7
[contest 782] 9.7 - XJOI 个人觉得温暖题啊,,,可是卡毛空间呀!!! T1 传送
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- hdu 4946 2014 Multi-University Training Contest 8
Area of Mushroom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2016 Multi-University Training Contest 2 D. Differencia
Differencia Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 2016 Multi-University Training Contest 1 G. Rigid Frameworks
Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
随机推荐
- NO.A.0009——day04——idea的安装及配置教程
概述: 集成开发环境:IDE.开发工具Integrated Development Environment,IDE, 1.如果自己手洗衣服: 1. 准备一盆水 2. 放入衣服浸泡30分钟 3. 搓洗衣 ...
- Ceph根据Crush位置读取数据
前言 在ceph研发群里面看到一个cepher在问关于怎么读取ceph的副本的问题,这个功能应该在2012年的时候,我们公司的研发就修改了代码去实现这个功能,只是当时的硬件条件所限,以及本身的稳定性问 ...
- 信息论-Turbo码学习
1.Turbo码: 信道编码的初期:分组码实现编码,缺点有二:只有当码字全部接收才可以开始译码,需要精确的帧同步时延大,增益损失多 解决方案:卷积码:充分利用前一时刻和后一时刻的码组,延时小,缺点:计 ...
- spring boot和spring cloud的区别
Java中说到微服务肯定离不开Spring Boot和Spring Cloud,这两者到底有什么关系,什么是微服务,如果单纯的说SpringBoot,SpringCloud,都是不准确的,那应该怎么回 ...
- bWAPP----SQL Injection (GET/Search)
SQL Injection (GET/Search) 输入单引号 报错,在%'附近出错,猜测参数被 '% %'这种形式包裹,没有任何过滤,直接带入了数据库查询 输入order by查询列 union ...
- Redis 用的很溜,了解过它用的什么协议吗?
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- PDF编辑:pdfFactory文本备注功能详解
除了word的doc文件外,PDF也是我们经常接触到的文件格式,经常需要在pdf文件上进行编辑与修改,或者给内容做提示和备注. 文件的文本备注功能可以用pdfFactory来进行,编辑打印PDF一条龙 ...
- 苹果电脑上folx下载器比迅雷还好用?
对于使用Mac电脑的小伙伴来说,除了迅雷以外,能够使用的下载工具非常少.小编也会经常被朋友问起,是否有好用的Mac下载工具推荐.小编都会毫不犹豫地推荐他们Folx,一款非常适用于Mac的下载工具.今天 ...
- 商业智能(BI)可视化大屏的设计及使用原则
信息时代,数据是一种可贵的资源,我们可能经常听到的一句话就是:用数据说话.但是,在没有进行系统化整理之前,数据不过只是一串串冰冷的数字,我们很难从大量的数据中获取到有价值的信息.只有通过合适的可视化工 ...
- 安装curl,composer
wget https://curl.haxx.se/download/curl-7.54.1.tar.gz tar -zvxf curl-7.54.1.tar.gz cd curl-7.54.1 ./ ...