题意是给了n组数,从每组数里挑一个数出来,求他们的因子,如果没有因子(也就是因子为1)的话就输出-1,如果有多个因子,输出一个就行。
是我们先输入第一组的a和b,然后输入2-n组的x和y,分别更新a = gcd(a,x * y),b = gcd(b,x * y);当a和b都等于1的时候说明没有符合题意的因子,输出-1,否则输出a或b中不等于1的数的一个因子即可。第二种方法是我们分别求出a和b的质因子,然后暴力去枚举每一组数据。
把a和b的质因子都列举出来,然后到剩下的N-1组数据中判断,一旦发现有一个质因子能满足被n-1组数据的任意一个数整除,就输出。
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { int n; scanf("%d",&n); ll a,b; scanf("%lld%lld",&a,&b); for(int i=2;i<=n;i++) { ll x,y; scanf("%lld%lld",&x,&y); a=__gcd(x*y,a); b=__gcd(x*y,b); } if(a>1) { for(int i=2;i*i<=a;i++) { if(a%i==0) { printf("%d\n",i); return 0; } } printf("%d\n",a); } else if(b>1) { for(int i=2;i*i<=b;i++) { if(b%i==0) { printf("%d\n",b); } else { printf("-1\n"); } }
#include <bits/stdc++.h> #define maxn 150005 using namespace std; int a[maxn],b[maxn]; int pre[maxn]; int n; int main() { scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d",&a[i],&b[i]); } int num = 0; for(int i = 2; i * i <= a[0]; i++){ if(a[0] % i == 0){ pre[num++] = i; while(a[0] % i == 0)a[0] /= i; } } if(a[0] > 1) pre[num++] = a[0]; for(int i = 2; i * i <= b[0]; i++){ if(b[0] % i == 0){ pre[num++] = i; while(b[0] % i == 0)b[0] /= i; } } if(b[0] > 1)pre[num++] = b[0]; for(int i = 0; i < num; i++){ int flag = 0; for(int j = 1; j < n; j++){ if(a[j] % pre[i] != 0 && b[j] % pre[i] != 0){ flag = 1; break; } } if(flag == 0){ cout<<pre[i]<<endl; return 0; } } puts("-1"); return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。