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)
不合法的情况是
#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
一定要留下来啊!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧