2024.1.18,非常开心的一天,第一次自己做出了的,并且也是第一次开出的题,遂写一篇题解来记录一下,终于感觉到自己的进步了。
这次感觉难度方面:。
分析
:由于要数尽量的大而且不能有且相邻的两个数也不能相等,我们很容易可以发现肯定是或者这样排列,所以就看的值,如果,说明恰好有对,如果,说明是对个,如果,说明是对个,然后输出即可。
:是一个挺有意思的题目,开始看的时候头都大了,说了一大堆概念,但是很快就发现其实这个题其实就是让我们判断一个二维矩阵里面是否存在不是规则图形(也就是不是矩形)的全是的区域,因此很显然我们想到,这就是一个比较隐晦的 模型,如果存在就输出,否则输出,是一个模板题。
:这个题居然过的和差不多多,我开始都傻眼了,这题好难的感觉,但是在仔细读完题之后我发现由于不限制次数,所以我们不一定要用很大的棋盘去覆盖,我们可以考虑两格的棋盘(也就是左白右黑和上白下黑)两种棋盘去覆盖,我们考虑到白色总是在黑色之前或者之上出现,于是我们选择从最右下角开始往前枚举每个格子,因为那也可以保证最大可能的满足每个要变成的格子,每改一个格子,就把两个坐标存进里面,但是要注意如果第一个格子是,那就不可以实现,因为找不到这样的棋盘。最后输出里面的坐标即可。
:这也是我没看题解过的第一个的题,特别特别有意思的一个数学题,虽然说看洛谷题解他们都说是大分类讨论题,但是我感觉跟分类讨论的关系其实不是非常大(虽然说也有分类讨论就是了),主要其实是发现一些比较有趣的性质。首先这个题的意思是给出一个好数和,问能不能找到至少两种方法将好数分解成两个及以上的美丽数的乘积。首先我们考虑如果给的数字就是一个美丽数,那么显然不可能分解成美丽数的乘积。因为美丽数的定义就是不能分解成两个好数的乘积的的倍数的数,故而我们深入思考一下,由于排除了第一种情况,那么很显然,这个,因此我们必然有一种分法,就是将所有因子全部除掉,我们不妨记那个最后剩下的数为,那么我们的第一种分法就是。如果不是质数,那么很显然可以把再分解成两个同样不是的倍数的数乘别的,那么很显然我们至少有两种。难点就在于如果是质数怎么办,如果是质数,我们就无法将其分解,因此肯定是看不出来第二种方法的,但是由于数据范围比较小,我们可以考虑暴力枚举每次除以之后,剩下的数(这个一定是合数),看他能不能分解成两个不是的倍数的数字,如果可以,显然是有两种方案的(直接),可以降低时间。然后我就交上去了,然后了,我看了的那个样例,恍然大悟,如果我们的是的平方,可以很好的卡掉以上的算法,因此我们可以考虑一个特判,只要我们第一步判断出来的整除的的个数,且且不是的乘方,那么我们就也可以将分解分别乘给前面的。写了好久,坑点还是挺多的。
代码
:
#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();
}
}
:
#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();
}
}
:
#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();
}
}
:
#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();
}
}
再接再厉,顶峰相见。