1. 程式人生 > >cf round 505(div1+div2)based on VK cup 2018 final B. Weakened Common Divisor

cf round 505(div1+div2)based on VK cup 2018 final B. Weakened Common Divisor

題意是給了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;
}