cf round 505(div1+div2)based on VK cup 2018 final B. Weakened Common Divisor
阿新 • • 發佈:2019-01-12
題意是給了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",i); return 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; }