牛客 Magic Forest

题意:

有n棵树,其魔力值为ai,对于任意(i, j) (i可以等于j),将出现魔力值为$a_i - a_j$ 和 $a_i$ + $a_j$ 的树在森林中,想知道是否有魔力值为x的树在森林中。

思路:

n个整数的裴蜀定理

有$a_1x_1+a_2x_2+...+a_nx_n = gcd(a_1, a_2, ..., a_n) = d$

若$x % d == 0$,则有解,否则无解

Code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

const int N = 1e3 + 20;

int n, m;
ll a[N], ans[N];

ll exgcd(ll a, ll b, ll &x, ll &y){
    if(!b){
        x = 1, y = 0;
        return a;
    }
    ll d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}


int main(){
    cin >> n >> m;
    
    for(int i = 0; i < n; i ++){
        cin >> a[i];
    }
    
    ll g = a[0];
    ans[0] = 1;
    
    ll k;
    for(int i = 1; i < n; i ++){
        g = exgcd(g, a[i], k, ans[i]);
        for(int j = 0; j < i; j ++){
            ans[j] *= k;
        }
    }
    
    int x;
    while(m --){
        cin >> x;
        
        if(x % g == 0){
            k = x / g;
            for(int i = 0; i < n; i ++){
                cout << ans[i] * k << " ";
            }
            cout << endl;
        }
        else{
            puts("NO");
        }
    }
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/jungu/p/13387974.html