洛谷 CF515B

    科技2025-01-13  9

    题目链接

    题目大意

    Drazil 有许多朋友,有一些人是乐观的,而其他人则不然(未必就是悲观的),她决定帮助她的朋友们。她的朋友,有 n 个男生和 m 个女生,编号分别是 0 ~ n-1 和 0 ~ m-1。Drazil决定每一天邀请第i号男生和第j(j=i \mod m)号女生共进晚餐,(i=0,1,……)。Drazil觉得,乐观是可以传染的,即她认为如果有人是乐观的,那么与他(她)共进晚餐的另一个人也会变得乐观(当然,如果两个人都是乐观的或者都不是乐观的,则保持原样),而且这种状态也会保持下去。现在的问题是,Drazil想知道,这种办法能否在若干天后使得她的所有朋友都会变得乐观。

    因为n, m都很小都不到100,所以我们可以模拟整个过程就好了,然后模拟2nm*__gcd(n, m)次就好了。

    上代码!!!

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<map> #define ll long long #define pi acos(-1) #define inf 0x3f3f3f3f #define pii pair<int, int> #define fi first #define se second #define mp(a, b) make_pair(a, b) #define piii pair<pii, int> #define uf(a, b, i) for (register int i = (a); i <= (b); ++i) #define df(a, b, i) for (register int i = (a); i >= (b); --i) using namespace std; inline int read() { int x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } template<class T> inline void print(T x) { if(x > 9) print(x/10); putchar(x%10 + '0'); } template<class T> T Max(T a, T b) { return a > b ? a : b; } template<class T> T Min(T a, T b) { return a < b ? a : b; } const ll mod = 1e9 + 7; int n, m, num; int cnt[2], a[2][103]; void scan() { n = read(); m = read(); uf (0, 1, i) { cnt[i] = read(); uf (1, cnt[i], j) { int val = read(); a[i][val] = 1; } } } void work() { num = 2 * n * m * __gcd(n, m); uf (1, num, i) { int man = i % n, woman = i % m; if (a[0][man] || a[1][woman]) a[0][man] = a[1][woman] = 1; } uf (0, n-1, j) { if (!a[0][j]) { puts("No\n"); return ; } } uf (0, m-1, j) { if (!a[1][j]) { puts("No\n"); return ; } } puts("Yes\n"); } int main() { scan(); work(); return 0; }
    Processed: 0.025, SQL: 8