2025.12.27 作业 - # P7243 最大公约数
题目背景
“寻求最大公约数是人民民主的真谛。……”
初秋,从枝丫滴下的阳光,柔和,在教室的窗棱溅起,润湿晨读的少女的脸颊。
“阿绫,阿绫”,天依低俯身子,八字辫耷拉在竖起的课本沿,“我们的最大公约数是多少呢?”
“一定不小吧”,左手悄悄捏捏天依的小臂,“比如呀,有一个公因子,叫做‘你喜欢我,我也喜欢你’。”
题目描述
相反,人际圈形形色色,公约数小得可怜,似乎很难保持自己的个性因而变成无趣的人呢。
现在把人际抽象成一个 \(n \times m\) 的矩形,每个人初始的个性为 \(a_{i,j}\)。从第二天开始,每个人会与上下左右四个人(如果存在)建立人际关系,其个性变为昨天自己和四周人个性的最大公约数。那么对于第 \(x\) 行第 \(y\) 列的人,在多少天后他的个性会变为 \(1\) 呢?
简化题意
有一个 \(n \times m\) 的矩阵 \(a\)。对一个矩阵进行变换,定义为将这个矩阵内的所有元素变为其上下左右四个元素(不存在则忽略)及自身的最大公约数。询问 \(a_{x,y}\) 在进行最少多少次变换之后会变成 \(1\)。如果可以使 \(a_{x,y}\) 经过若干次变换变成 \(1\),输出其中最小的次数;否则输出 \(-1\)。
输入格式
第一行两个整数 \(n,m\),表示矩阵的行数和列数。
接下来 \(n\) 行,每行 \(m\) 个整数,第 \(i\) 行第 \(j\) 列的整数 \(a_{i,j}\) 描述了该位置的人的初始个性。
接下来一行两个整数 \(x,y\),表示某个指定的人的位置。
输出格式
一行一个整数 \(d\),表示第 \(x\) 行第 \(y\) 列的人的个性会在 \(d\) 天后变为 \(1\);特别地,若永远不会变为 \(1\),应输出 \(-1\)。
输入输出样例 #1
输入 #1
2 2
2 2
1 2
2 1
输出 #1
0
输入输出样例 #2
输入 #2
2 2
2 2
2 2
1 1
输出 #2
-1
输入输出样例 #3
输入 #3
3 3
3 2 3
2 3 2
3 2 3
2 2
输出 #3
1
说明/提示
样例解释 3
第一天的个性矩阵(也就是最开始的矩阵)为
第二天的个性矩阵为
可见只需要经过一天,\(a_{2,2}\) 就会变为 \(1\),所以答案为 \(1\)。
数据规模与约定
本题采用捆绑测试。
对于 \(100\%\) 的数据,\(1\le n,m\le 2\times 10^3\),\(1\le a_{i,j}\le 10^{18}\),\(1\le x\le n\),\(1\le y\le m\)。
| 子任务 | 分值 | \(n,m\) | 特殊限制 |
|---|---|---|---|
| 1 | 1 | / | 保证给出的位置个性永远不会变为 \(1\) |
| 2 | 1 | / | 保证 \(a_{x,y}=1\) |
| 3 | 3 | $ \le 2$ | / |
| 4 | 10 | $ \le 10^2$ | / |
| 5 | 30 | $ \le 5\times 10^2$ | / |
| 6 | 10 | / | 保证对于所有的 \(a_{i,j} \le 2\) |
| 7 | 10 | / | 保证 \(x\) 与 \(y\) 都等于 \(1\) |
| 8 | 35 | / | / |
#include <iostream>
#define LL long long
using namespace std;
int n,m,s[4000003],Q[4000003][2];
LL a[2002][2002];
bool F[2002][2002];
const int dx[4]={0,1,0,-1};
const int dy[4]={-1,0,1,0};
LL gcd(LL ta, LL tb) {while (tb != 0) {LL temp = tb;tb = ta % tb; ta = temp;}return ta;
}
int main() {cin>>n>>m;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++) cin>>a[i][j];int x,y;cin>>x>>y;if (a[x][y]==1) { cout<<0<<endl; return 0; }F[x][y]=1;int f=0,r=1;LL val;Q[1][0]=x;Q[1][1]=y;val=a[x][y];s[1]=0;while (f<r) {f++;int xx,yy,tx,ty;xx=Q[f][0];yy=Q[f][1];for (int k=0;k<4;k++) {tx=xx+dx[k];ty=yy+dy[k];if (tx==0 || ty==0 || tx==n+1 || ty==m+1 || F[tx][ty]==1) continue;F[tx][ty]=1;val=gcd(val,a[tx][ty]);//cout<<tx<<" "<<ty<<" "<<val<<endl;if (val==1) { cout<<s[f]+1<<endl;return 0;}r++;Q[r][0]=tx;Q[r][1]=ty;s[r]=s[f]+1;}}cout<<-1<<endl;return 0;
}本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1196197.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!