Comet OJ - Contest #13
Rank53。
第一次打这种比赛。还是有不少问题的,以后改吧。
A题WA了两次罚了不少时。
C写到一半发现只能过1,就先弃了。
D一眼没看出来。第二眼看出来就是一个类似于复数的快速幂。
然后B切了。
最后切C,重构了一次。还TLE了3发。浪费了大量时间。
Tips:
1、A题FB基本上拿不到的,好好写1A就没事了。
2、先看一遍,大码题和数据结构放后面。
3、先开数论,就TM死刚数论。(这次要是切A之后直接刚D就有FB了)
4、别急,奖励拿不拿就那样吧。
下面是solution:
A
签到题。
#include<bits/stdc++.h>
using namespace std;
namespace IO
{
char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[15],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);
char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
void Flush(){fwrite(obuf,1,oS-obuf,stdout),oS=obuf;}
void Put(char x){*oS++=x;if(oS==oT)Flush();}
int read(){int x=0,c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
void write(int x){int top=0;if(!x)Put('0');while(x)st[++top]=(x%10)+48,x/=10;while(top)Put(st[top--]);Put(' ');}
char fetch(){char ch=Get();while(ch^'B'&&ch^'G')ch=getchar();return ch;}
}
using namespace IO;
int main()
{
int i,n=read();int b=0;
for(i=1;i<=n;++i) if(fetch()=='G') ++b;
cout<<b;
}
B
模拟题。
#include<bits/stdc++.h>
#define pi pair<int,int>
#define pub push_back
#define puf push_front
#define pob pop_back
#define fi first
#define se second
using namespace std;
const int N=401;
char str[N],opt[100001];int a[N][N],n,m;deque<pi>q;map<char,int>mp;
int dx[5]={0,-1,0,1,0},dy[5]={0,0,-1,0,1};
int in(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;}
int main()
{
int i,j,op,nx,ny;
mp['W']=1,mp['A']=2,mp['S']=3,mp['D']=4;
cin>>n>>m;
for(i=1;i<=n;++i)
{
scanf("%s",str+1);
for(j=1;j<=m;++j)
if(str[j]=='o') a[i][j]=1;
else if(str[j]=='@') q.pub(pi(i,j)),nx=i,ny=j;
}
scanf("%s",opt+1);
for(i=1;i<=strlen(opt+1);++i)
{
op=mp[opt[i]],nx+=dx[op],ny+=dy[op];
if(!in(nx,ny)) {puts("GG");return 0;}
q.puf(pi(nx,ny));
if(a[nx][ny]) a[nx][ny]=0; else q.pob();
}
for(auto x:q) a[x.fi][x.se]=2;
a[q.front().fi][q.front().se]=3;
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
if(a[i][j]==1) putchar('o');
else if(a[i][j]==2) putchar('X');
else if(a[i][j]==3) putchar('@');
else putchar('.');
}
puts("");
}
}
C
全图开个并查集维护连通块。
每一行开个并查集维护下一个\(0\)的位置。
实时维护答案。
每次把每一行的没覆盖的\(0\)变成\(1\),并把其与四角中存在的\(1\)合并。
易证其正确性。
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1001;
int n,m,ans,fa[N*N],size[N*N],f[N][N],vis[N*N],mp[N][N];char str[N];
int h(int x,int y){return (x-1)*m+y;}
int Find(int x){return x==fa[x]? x:fa[x]=Find(fa[x]);}
int fd(int s,int x){return x==f[s][x]? x:f[s][x]=fd(s,f[s][x]);}
int read(){int x;scanf("%d",&x);return x;}
void merge(int a,int b)
{
if(size[a]>size[b]) fa[b]=a,size[a]+=size[b];
else fa[a]=b,size[b]+=size[a];
}
int main()
{
scanf("%d%d",&n,&m);int i,j,Q,x1,y1,x2,y2,a,b;
for(i=1;i<=n;++i)
{
scanf("%s",str+1);
for(j=1;j<=m;++j) mp[i][j]=str[j]=='1';
}
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
fa[h(i,j)]=h(i,j),size[h(i,j)]=1;
if(mp[i][j])
{
++ans,a=h(i,j);
if(i^1&&mp[i-1][j]) --ans,merge(Find(h(i-1,j)),a);
a=Find(a);
if(j^1&&mp[i][j-1]&&a^(b=Find(h(i,j-1)))) --ans,merge(a,b);
}
}
for(i=1;i<=n;++i) for(j=1;j<=m;++j) f[i][j]=j;
for(i=1;i<=n;++i) for(j=1;j<m;++j) if(mp[i][j+1]) f[i][j]=j+1;
for(Q=read();Q;--Q)
{
x1=read(),y1=read(),x2=read(),y2=read();
for(i=x1;i<=x2;++i)
{
for(j=y1;j<=y2;j=fd(i,j)+1)
if(!mp[i][j])
{
mp[i][j]=1,++ans,a=h(i,j);
if(i^1&&mp[i-1][j]&&a^(b=Find(h(i-1,j)))) --ans,merge(a,b);
a=Find(a);
if(j^1&&mp[i][j-1]&&a^(b=Find(h(i,j-1)))) --ans,merge(a,b);
a=Find(a);
if(i^n&&mp[i+1][j]&&a^(b=Find(h(i+1,j)))) --ans,merge(a,b);
a=Find(a);
if(j^m&&mp[i][j+1]&&a^(b=Find(h(i,j+1)))) --ans,merge(a,b);
}
f[i][y1]=fd(i,y2);
}
cout<<ans<<endl;
}
}
D
题解似乎用的是二次剩余+矩阵快速幂...
实际上我们可以这样理解:
我们要求的是\(\sum\limits_{i=0}^{\lfloor\frac n2\rfloor}\sqrt a^{2i}b^{n-2i}{n\choose 2i}\)。
这个东西很像二项式定理对吧。
实际上就是\((\sqrt a+b)^n=\sum\limits_{i=0}^n\sqrt a^ib^{n-i}{n\choose i}\)中\(\sqrt a\)的指数为偶数的项的和。
这样就好做了。
类似于虚数单位\(i\)一样,我们将\(\sqrt a\)记做一个新的单位,这个单位的平方\(\sqrt a^2=a\)(不管其有没有二次剩余都可以这么认为)。那么所有的数都可以记做\(x*\sqrt a+y*1\),乘法加法直接搬复数的那一套就行了。
那么我们考虑在\((\sqrt a+b)^n\)的展开式中,\(\sqrt a\)的指数为偶数的项一定是\(x*1\)的形式,\(\sqrt a\)的指数为奇数的项一定是\(x*\sqrt a\)的形式。
也就是说,我们要求的\((\sqrt a+b)^n\)的展开式中\(\sqrt a\)的指数为偶数的项的和就是\((\sqrt a+b)^n\)的结果中\(1\)前面的系数。
直接快速幂做即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a,b,p;
ll mul(ll a,ll b){return (__int128)a*b%p;}
ll inc(ll a,ll b){a+=b;return a>=p? a-p:a;}
struct node{ll x,y;node(ll a=0,ll b=0){x=a,y=b;}};
node mul(node i,node j)
{
return node(inc(mul(i.x,j.x),mul(mul(i.y,j.y),a)),inc(mul(i.x,j.y),mul(i.y,j.x)));
}
ll power(ll n)
{
node s(b,1),r(1);
for(;n;n>>=1,s=mul(s,s))
if(n&1)
r=mul(s,r);
return r.x;
}
void solve()
{
scanf("%lld%lld%lld%lld",&n,&a,&b,&p);
printf("%lld\n",power(n));
}
int main()
{
int T;cin>>T;
while(T--) solve();
}
Comet OJ - Contest #13的更多相关文章
- Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」
来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)
来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...
- Comet OJ Contest #13 D
Comet OJ Contest #13 D \(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n- ...
- Comet OJ Contest #13 简要题解
C2 首先用并查集维护\(1\)的连通块,然后用另外一个并查集维护第\(i\)行中,第\(j\)列之后的第一个\(0\)的位置,就是如果当前位置是\(1\)那么它的父亲是它右边的格子,否则是它自己. ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(困难版) 并查集
题意 给一个$ n \times m$ 的网格,每个格子里有一个数字,非 \(0\) 即 \(1\),行从上往下依次编号为 \(1, 2, \cdots, n\),列从左往右依次编号为 \(1, 2, ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
- Comet OJ - Contest #2简要题解
Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...
- Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
随机推荐
- Java中截取字符串中小数点前面的字符
通过下标获取 String number = "2563.2154"; int index = number.indexOf("."); String intN ...
- stack和queue小讲
由于stack和queue没有太多新的东西,故在此只把API拿出来小说一下,自己也记得比较牢靠一些. stack常用API push(int elem); //向栈顶添加元素 pop(); //从栈顶 ...
- [CSP-S模拟测试]:中间值(二分)
题目背景 $Maxtir$喜欢序列的中间值. 题目传送门(内部题127) 输入格式 第一行输入两个正整数$n,m$,其中$m$是操作和询问次数. 接下来两行每行输入$n$个非负整数,每一行分别表示两个 ...
- C++入门经典-例5.16-输出引用
1:如不加特殊说明,一般认为引用指的都是左值引用.引用实际上是一种隐式指针,它为对象建立一个别名,通过操作符&来实现,引用的形式如下: 数据类型 & 表达式: 例如: int a=10 ...
- DS博客大作业--树
1.树的存储结构说明 树节点结构体 data:文件名 brother:兄弟节点 child:孩子节点 type:节点的类型,0为文件,1为目录 h:节点所在的层次 2.树的函数说明 头文件 函数1:C ...
- HTML控件 隐藏
div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白: style="visibility: none;" document.getElementById ...
- Docker安装Zookeeper并进行操作
Docker安装Zookeeper 下载Zookeeper镜像docker pull zookeeper1启动容器并添加映射docker run --privileged=true -d --name ...
- vuex里面的store架构
将store文件夹分为四个文件夹,分别是actions,getters,mutations,state. action:和mutatation功能是类似的,都是修改state里面的数据,区别是acti ...
- 【10】css设置文字不换行,超过的部分用“...”代替
设置文字不换行,超过的部分用“...”代替 overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 210 ...
- 对redis的一些理解
缓存就是在内存中存储的数据备份,当数据没有发生本质变化的时候,我们避免数据的查询操作直接连接数据库,而是去 内容中读取数据,这样就大大降低了数据库的读写次数,而且从内存中读数据的速度要比从数据库 ...