Codeforces Round 777 (Div. 2)

177 阅读6分钟

2024.1.18,非常开心的一天,第一次自己做出了div2div2ABCDABCD,并且也是第一次开出19001900的题,遂写一篇题解来记录一下,终于感觉到自己的进步了。

传送门

这次感觉难度方面:AC<B<DA≈C<B<D

分析

AA:由于要数尽量的大而且不能有00且相邻的两个数也不能相等,我们很容易可以发现肯定是1212...1212...或者2121..2121..这样排列,所以就看nmod3nmod3的值,如果00,说明恰好有n/3n/32121,如果11,说明是n/3n/312+112+111,如果22,说明是n/3n/321+121+122,然后输出即可。

BB:BB是一个挺有意思的题目,开始看的时候头都大了,说了一大堆概念,但是很快就发现其实这个题其实就是让我们判断一个二维矩阵里面是否存在不是规则图形(也就是不是矩形)的全是11的区域,因此很显然我们想到BFSBFS,这就是一个比较隐晦的FloodFlood fillfill模型,如果存在就输出NONO,否则输出YESYES,是一个模板题。

CC:这个题居然过的和BB差不多多,我开始都傻眼了,这题好难的感觉,但是在仔细读完题之后我发现由于不限制次数,所以我们不一定要用很大的棋盘去覆盖,我们可以考虑两格的棋盘(也就是左白右黑和上白下黑)两种棋盘去覆盖,我们考虑到白色总是在黑色之前或者之上出现,于是我们选择从最右下角开始往前枚举每个格子,因为那也可以保证最大可能的满足每个要变成11的格子,每改一个格子,就把两个坐标存进vectorvector里面,但是要注意如果第一个格子是11,那就不可以实现,因为找不到这样的棋盘。最后输出vectorvector里面的坐标即可。

DD:这也是我没看题解过的第一个19001900的题,特别特别有意思的一个数学题,虽然说看洛谷题解他们都说是大分类讨论题,但是我感觉跟分类讨论的关系其实不是非常大(虽然说也有分类讨论就是了),主要其实是发现一些比较有趣的性质。首先这个题的意思是给出一个好数和dd,问能不能找到至少两种方法将好数分解成两个及以上的美丽数的乘积。首先我们考虑如果给的数字就是一个美丽数,那么显然不可能分解成美丽数的乘积。因为美丽数的定义就是不能分解成两个好数的乘积的dd的倍数的数,故而我们深入思考一下,由于排除了第一种情况,那么很显然,这个xmodd2==0x mod d^2==0,因此我们必然有一种分法,就是将xx所有dd因子全部除掉,我们不妨记那个最后剩下的数为kk,那么我们的第一种分法就是d,d...,d,kdd,d...,d,kd。如果kk不是质数,那么很显然可以把kk再分解成两个同样不是dd的倍数的数乘别的dd,那么很显然我们至少有两种。难点就在于如果kk是质数怎么办,如果是质数,我们就无法将其分解,因此肯定是看不出来第二种方法的,但是由于数据范围比较小,我们可以考虑暴力枚举每次除以dd之后,剩下的数(这个一定是合数),看他能不能分解成两个不是dd的倍数的数字,如果可以,显然是有两种方案的(直接returnreturn),可以降低时间。然后我就交上去了,然后WA2WA2了,我看了WAWA的那个样例,恍然大悟,如果我们的ddkk的平方,可以很好的卡掉以上的算法,因此我们可以考虑一个特判,只要我们第一步判断出来的整除的dd的个数4≥4,且d==k2d==k^2xx不是dd的乘方,那么我们就也可以将dd分解分别乘给前面的dd。写了好久,坑点还是挺多的。

代码

AA:

#include <bits/stdc++.h>

#define ll long long

#define x first
#define y second
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
int t;
void solve(){
	int n;
	cin>>n;
	if(n%3==0){
		for(int i=1;i<=n/3;i++){
			cout<<21; 
		}
	}
	else if(n%3==1){
		for(int i=1;i<=n/3;i++){
			cout<<12;
		}
		cout<<1;
	}
	else{
		for(int i=1;i<=n/3;i++){
			cout<<21;
		}
		cout<<2;
	}
	cout<<"\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--){
		solve();
	}
}

BB:

#include <bits/stdc++.h>

#define ll long long

#define x first
#define y second
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
int t,n,m;
const int N=105;
bool st[N][N];
char a[N][N];
typedef pair<int,int> PII;
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
bool bfs(int l,int r){
	queue<PII> q;
	q.push({l,r});
	st[l][r]=true;
	int res=0;
	res++;
	int maxl=l,minl=l,maxr=r,minr=r;
	while(q.size()){
		PII tt=q.front();
		q.pop();
		int nowx=tt.x,nowy=tt.y;
		for(int i=0;i<4;i++){
			int nex=nowx+dx[i],ney=nowy+dy[i];
			if(nex>=1 && nex<=n && ney>=1 && ney<=m && st[nex][ney]==false && a[nex][ney]=='1'){
				st[nex][ney]=true;
				res++;
				maxl=max(maxl,nex);minl=min(minl,nex),maxr=max(maxr,ney),minr=min(minr,ney);
				q.push({nex,ney});
			}
		}
	}
	return res==(maxl-minl+1)*(maxr-minr+1);
}
void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			st[i][j]=false;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	} 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(!st[i][j] && a[i][j]=='1'){
				if(!bfs(i,j)){
					cout<<"NO\n";
					return;
				}
			}
		}
	} 
	cout<<"YES\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--){
		solve();
	}
}

CC:

#include <bits/stdc++.h>

#define ll long long

#define x first
#define y second
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
int t,n,m;
const int N=105;
bool st[N][N];
char a[N][N];
typedef pair<int,int> PII;
void solve(){
	vector<pair<PII,PII>> v;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			st[i][j]=false;
		}
	}for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=n;i>=1;i--){
		for(int j=m;j>=1;j--){
			if(a[i][j]=='1'){
				if(i-1>=1){
					v.push_back({{i-1,j},{i,j}});
				}
				else if(j>=2){
					v.push_back({{i,j-1},{i,j}});
				}
				else{
					cout<<"-1\n";
					return;
				}
			}
		}
	} 
	cout<<v.size()<<"\n";
	for(int i=0;i<v.size();i++){
		cout<<v[i].x.x<<" "<<v[i].x.y<<" "<<v[i].y.x<<" "<<v[i].y.y<<"\n";
	}
}
int main(){
	IOS;
	cin>>t;
	while(t--){
		solve();
	}
}

DD:

#include <bits/stdc++.h>

#define ll long long

#define x first
#define y second
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
int t,n,m;
const int N=105;
bool st[N][N];
char a[N][N];
typedef pair<int,int> PII;
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
bool is_prime(int x){
	if(x==1) return true;
	else{
		for(int i=2;i<=x/i;i++){
			if(x%i==0) return false;
		}
	}
	return true;
}
void solve(){
	ll x,d;
	cin>>x>>d;
	if(x%(1ll*d*d)!=0){
		cout<<"NO\n";
		return;
	} 
	ll temp=x;
	int cnt=0;
	while(temp%d==0){
		temp/=d;
		cnt++;
	}
	
	if(!is_prime(temp)){
		cout<<"YES\n";
		return;
	}
	x/=(d*d);
	while(x%d==0){
		for(int i=2;i<=x/i;i++){
			if(x%i==0){
				if((x/i)%d && (i%d)){
					cout<<"YES\n";
					return;
				}
			}
		}
		x/=d;
	}
	int s=sqrt(d);
//	cout<<" "<<temp<<"\n";
	if(cnt>=4 && s*s==d && temp!=1){
		cout<<"YES\n";
		return;
	}
	cout<<"NO\n";
	
}
int main(){
	IOS;
	cin>>t;
	while(t--){
		solve();
	}
}

再接再厉,顶峰相见。