Codeforces Round #777 (Div. 2) A-D

A

https://codeforces.com/contest/1647/problem/A
选取的数字越小,形成的数位数越多。又因为不能放置连续两个相同的数,因此,我们选取1212...或者2121...

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 200005;
int n,m,t;
int a[N],b[N];

int main(){
	cin>>t;
    while(t--){
        cin>>n;
      	int ty=1;
		int t3=n/3;  //t3 1 t3 2
		int more=n-t3*3;
		if(more==0){
			for(int i=1;i<=2*t3;i++){
				if(i%2) cout<<2;
				else cout<<1;
			}
			puts("");
		}
		if(more==1){
			for(int i=1;i<=2*t3;i++){
				if(i%2) cout<<1;
				else cout<<2;
			}
			cout<<1<<endl;
		}
		if(more==2){
			for(int i=1;i<=2*t3;i++){
				if(i%2) cout<<2;
				else cout<<1;
			}
			cout<<2<<endl;
		}
    }
	return 0;
} 

B

https://codeforces.com/contest/1647/problem/B
容易发现,当填入的数满足在2x2的方格中有一个是0 而其他为1时,是不合法的

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 200005;
int n,m,t;
int a[105][105];

int main(){
	cin>>t;
    while(t--){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
        	for(int j=1;j<=m;j++){
        		scanf("%1d",&a[i][j]);
			}
		}
		bool f=1;
		for(int i=1;i<n;i++){
			if(f==0) break;
         	for(int j=1;j<m;j++){
        		if(a[i][j]==0&&a[i][j+1]==1&&a[i+1][j]==1&&a[i+1][j+1]==1){
        			f=0;
        			break;
				}
				if(a[i][j]==1&&a[i][j+1]==0&&a[i+1][j]==1&&a[i+1][j+1]==1){
        			f=0;
        			break;
				}
				if(a[i][j]==1&&a[i][j+1]==1&&a[i+1][j]==0&&a[i+1][j+1]==1){
        			f=0;
        			break;
				}
				if(a[i][j]==1&&a[i][j+1]==1&&a[i+1][j]==1&&a[i+1][j+1]==0){
        			f=0;
        			break;
			        }
				
			}
		}
		if(f) puts("YES");
		else puts("NO");
    }
	return 0;
} 

C

https://codeforces.com/contest/1647/problem/C
简单的构造题,题目不看错很容易写出来。
对于填入了1的格子,我们只需要先从下往上(从第n行到第2行)竖着填2x1的方格(上0下1),如果当前格子是0则不做操作
第一行可以从右往左横着填1x2的方格(左0右1)
不合法的情况是a11=1

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,t;
int a[205][205],b[205][205];
vector<int>ans;

int main(){
	cin>>t;
    while(t--){
    	memset(b,0,sizeof(b));
        cin>>n>>m;
        for(int i=1;i<=n;i++){
        	for(int j=1;j<=m;j++){
        		scanf("%1d",&a[i][j]);
			}
		}
		if(a[1][1]==1){
			puts("-1");
			continue;
		}
		ans.clear();
		
		for(int i=n;i>=2;i--){
			for(int j=1;j<=m;j++){
				if(a[i][j]==1&&b[i][j]==0){
					ans.push_back(i-1);
					ans.push_back(j);
					ans.push_back(i);
					ans.push_back(j);
					
					b[i-1][j]=0;
					b[i][j]=1;
				}
			}
		}
		
		for(int j=m;j>1;j--){
			if(a[1][j]==1&&b[1][j]==0){
				ans.push_back(1);
				ans.push_back(j-1);
				ans.push_back(1);
				ans.push_back(j);
				
				b[1][j-1]=0;
				b[1][j]=1;
			}
		}
		
		cout<<ans.size()/4<<endl;
		int cc=0;
		for(int i=0;i<ans.size();i++){
			printf("%d ",ans[i]);
			cc++;
			if(cc==4){
				cc=0;
				puts("");
			}
		}
    }
	return 0;
} 

D

https://codeforces.com/contest/1647/problem/D
其实有点迷
是一道需要仔细分类讨论的题目,细节见代码
p.s.有一处两种写法一个对一个错,我也不知道是为什么(错误写法已注释

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t;
ll x,d;

bool prime(ll x){
    if(x<4) return 1;
    for(ll i=2;1ll*i*i<=x;i++){
        if(x%i==0) return 0;
    }
    return 1;
}

int main(){
	cin>>t;
    while(t--){
    	cin>>x>>d;
		if(x%(d*d)!=0){
			puts("NO");
			continue;
		}

		if(prime(d)){
			ll tem=x/d/d;
			while(tem%d==0) tem/=d;
			if(tem==1){
				puts("NO");
				continue;
			}
			else{
				if(prime(tem)){
					puts("NO");
					continue;
				}
				puts("YES");
				continue;
			}
		}
		else{
			int ans=0;
			int cntd=0;
			ll tem=x;
			while(tem%d==0){
				tem/=d;
				cntd++;
			}
			if(cntd>=4){
				puts("YES");
				continue;
			}
			tem=x/d/d;

			if(cntd==2){
				if(prime(tem)){
					puts("NO");
					continue;
				}
				else{
					puts("YES");
					continue;
				}
			}

			if(cntd==3){
				// bool f=0;
				// for(ll i=2;1ll*i*i<=tem;i++){
				// 	if(tem%i==0&&i%d&&(tem/i)%d&&!(i==d||i==(tem/d))){
				// 		f=1;
				// 		break;
				// 	}
				// }
				// if(f){
				// 	puts("YES");
				// 	continue;
				// }
				// else{
				// 	puts("NO");
				// 	continue;
				// }

				int cnt=0;
				for(ll i=2;1ll*i*i<=tem;i++){
					if(tem%i==0&&i%d&&(tem/i)%d&&!(i==d||i==(tem/d))){
						cnt++;
					}
				}
				if(tem==d) cnt++;
				else{
					tem/=d;
					if(prime(tem)) cnt++;
					else cnt+=2;
				}
				if(cnt>=2){
					puts("YES");
					continue;
				}
				else{
					puts("NO");
					continue;
				}
			}
			
		}
        
    }
    system("pause");
	return 0;
} 

总结

AB秒过,C竟然看错条件了一直wa...我真的太菜了!!丢人了呜呜呜!!
今天要做两套vp
一定要留下来啊!!!

posted @   starlightlmy  阅读(138)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示