codeforces Round #644 (Div. 3)
A
ans=(max(min(a,b)*2, max(a, b)))^2;
B
相差最小的两个数的差即为答案
C
奇数个数为奇数的时候如果没有相差1的数就输出NO
D
遍历1到sqrt(N),找出符合条件的最小的i
E
遍历所有1,1的右边和下面如果都为0则输出NO
F
等题解明天补
G
贪心,下一行从上一行最后1的下一个位置开始接着放a个1,超过边界就从头放,最后检查矩阵是否满足题目条件
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll t;
cin>>t;
while(t--)
{
int n, m, a, b, map[60][60], lastj=0;
bool jg=1;
cin>>n>>m>>a>>b;
for(int i=0; i<n; i++)
{
memset(map[i], 0, sizeof(map[i]));
int nh=0;
while(nh<a)
{
map[i][lastj]=1;
nh++;
lastj++;
lastj%=m;
}
}
for(int i=0; i<n; i++)
{
int nh=0;
for(int j=0; j<m; j++)
{
if(map[i][j])
nh++;
}
if(nh!=a)
{
jg=0;
break;
}
}
for(int i=0; i<m; i++)
{
int nl=0;
for(int j=0; j<n; j++)
{
if(map[j][i])
nl++;
}
if(nl!=b)
{
jg=0;
break;
}
}
if(jg)
{
cout<<"YES"<<endl;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cout<<map[i][j];
}
cout<<endl;
}
}
else
cout<<"NO"<<endl;
}
}