20181107 模擬賽T1:快樂傳遞政治正確版

問題描述

David 有不少好朋友。有些期末季剛結束,有些人很快樂,但有些不太快樂,David 想把快樂傳遞給每一個人,做爲心理學大師,他準備了以下計劃:David 的朋友中有 n 個男生m 個女生, 還有 k 個跨性別者,方便起見,將他們分別編號爲 0,...,n−1 和 0,...,m−1, 0,...,k −1,在第 i 天,David會邀請編號爲 (i mod n) 的男生和編號爲 (i mod m) 的女生還有 (i mod k)的跨性別者共進晚餐(由於 David 同時是程序員,因此從這個計劃從第 0天開始) 。共進晚餐的三我的只要至少有有一個是快樂的人,另外的人也會變得快樂起來。不然你們的狀態不會改變(一旦一我的是快樂的,他就會永遠快樂下去) 。如今問題來了,David 想知道他是否能經過這個計劃使得全部人都快樂起來呢?ios

輸入格式程序員

第一行一個整數 T ≤ 20,表示該測試點數據組數數組

每組數據的第一行包含三個整數 n,m,k, 保證至少一類人不爲空app

接下來一行第一個整數爲 0 ≤ b ≤ n ,表示目前快樂的男生的數量,接下來
b 個空格隔開的整數 0 ≤ x i < n,表示快樂的男生的編號。測試

接下來一行第一個整數爲 0 ≤ g ≤ m ,表示目前快樂的女生的數量,接下
來 g 個空格隔開的整數 0 ≤ y i < m,表示快樂的女生的編號。spa

接下來一行第一個整數爲 0 ≤ t ≤ k ,表示目前快樂的跨性別者的數量,接
下來 t 個空格隔開的整數 0 ≤ z i < t,表示快樂的跨性別者的編號。code

相鄰兩組數據之間有一行空行get

輸出格式string

假如最終全部人都能變的快樂起來,就輸出」Yes」 (不帶引號),不然輸出」No」.it

樣例輸入 1
3
2 3 0
0
1 0
0
2 4 0
1 0
1 2
0
2 3 0
1 0
1 1
0

樣例輸出 1

Yes
No
Yes

樣例解釋

對於第一組數據:
第 0 天,0 號男生和 0 號女生吃飯,由於 0 號女生是快樂的,因此 0 號男
生也變得快樂了;

第 1 天,1 號男生和 1 號女生吃飯,由於他們原本就都不快樂,狀況沒有變
化;

第 2 天,0 號男生和 2 號女生吃飯,由於 0 號男生是快樂的,因此 2 號女
生也變得快樂了;

第 3 天,1 號男生和 0 號女生吃飯,由於 0 號女生是快樂的,因此 1 號男
生也變得快樂了;

第 4 天,0 號男生和 1 號女生吃飯,由於 0 號男生是快樂的,因此 1 號女
生也變得快樂了;
這樣就全都快樂了

對於第二組數據:1 號男生,1 號女生和 3 號女生永遠也無法變得快樂

數據範圍及約定

對於 50% 的數據,n,m ≤ 100,k = 0
對於 70% 的數據, n,m,k ≤ 2000
另外存在 10% 的數據, n,m ≤ 1000000000, b,g ≤ 100000,k = 0
對於 100% 的數據,n,m,k ≤ 1000000000, b,g,t ≤ 100000

// 70 fen baoli 
/*
    QAQ 這個70的baoli調了1h...而後就看見千古神犇 axm dalao的正解都寫完了QAQ,在寫暴力
    對拍,我好慌,偶然一撇看到了他把它們放到了一個數組裏,因而我也把他們放到一個
    數組裏,搞了很久一直不對。。放棄之際,決定再掙扎一下,而後..就調出來了,,但
    是寫完第一題心態爆炸. (PS:你們可不要學我沒事亂看哦QAQ)
*/
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
using namespace std;
const int N=1e6+10;

inline int read() {
    int n=0,f=1;char ch=getchar();
    while (ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}
    while (ch<='9' && ch>='0') {n=(n<<3)+(n<<1)+ch-'0';ch=getchar();}
    return n*f;
}

inline void init() {
    freopen("happy2.in","r",stdin);
    freopen("happy2.out","w",stdout);
}

int x[N],y[N],z[N];
int T,n,m,k,b,a,c;

int main() {
    init();
    T=read();
    while (T--) {
        n=read(),m=read(),k=read();
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        memset(z,0,sizeof(z));
        int aa=read();
        for(int i=1;i<=aa;++i) a=read(),x[a]=1;
        int ba=read();
        for(int i=1;i<=ba;++i) b=read(),y[b]=1;
        int ca=read();
        for(int i=1;i<=ca;++i) c=read(),z[c]=1;
        if(k) {
            for(int i=0;i<=100000;++i)
                if(y[i%m] || x[i%n] || z[i%k])
                    y[i%m]=x[i%n]=z[i%k]=1;
            
        } else {
            for(int i=0;i<=100000;++i)
                if(y[i%m] || x[i%n]) y[i%m]=x[i%n]=1;
        }
        int bz=1;
        for(int i=0;i<n;++i)
            if(!x[i]) bz=0;
        for(int i=0;i<m;++i)
            if(!y[i]) bz=0;
        for(int i=0;i<k;++i)
            if(!z[i]) bz=0;
        if(bz==0) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

std:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
using namespace std;
const long long inf=947483648;
const int N=1e5+10;

ll T,n,m,k;
ll a[N],b[N],cc[N],vis[N];  

inline ll read() {
    ll n=0,f=1;char ch=getchar();
    while (ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}
    while (ch<='9' && ch>='0') {n=(n<<3)+(n<<1)+ch-'0';ch=getchar();}
    return n*f;
}

inline ll gcd(ll a,ll b) {
    if(b==0) return a;
    else return gcd(b,a%b);
}

inline void init() {
    freopen("happy2.in","r",stdin);
    freopen("happy2.out","w",stdout);
}
int main() {
    init();
    T=read();
    while (T--) {
        memset(vis,0,sizeof(vis));
        n=read(),m=read(),k=read();
        ll jc=gcd(gcd(n,m),k);
        ll a1,b1,c1;
        a1=read();
        for(ll i=0;i<a1;++i) vis[read()%jc]=1;
        b1=read();  
        for(ll i=0;i<b1;++i) vis[read()%jc]=1;
        c1=read();
        for(ll i=0;i<c1;++i) vis[read()%jc]=1;
        ll c=1;
        for(ll i=0;i<jc;++i) 
            if(!vis[i]) {
                c=0; break;
            }
        if(!c || a1+b1+c1==0) printf("No\n");
        else printf("Yes\n");
    }
    
    fclose(stdin); fclose(stdout);
    return 0;
}
相關文章
相關標籤/搜索