这是 Codeforces Round #292 (Div. 2)的一道题,原题在这里,题意就是:

小明有n个男同学(编号为 0 ~ n-1)和m个女同学 (编号为 0 ~ m-1),小明要安排男女之间约会,如何安排约会呢,假设时间是i (i >=0) ,小明在 i 天就邀请 i % n 号男同学,和 i % m 号女同学约会,如果男女同学之间有一个是快乐的,那么两个人都是快乐的,那么问题来了,小明能否使他们全部都快乐?

我当时是这样想的,要是n和m相等的话,那么要是在编号区间 [0, n)之间都有人快乐,例如,

例a:

要是n = m = 3, n 中快乐的有 0、1, m 中快乐的有 2,那么全部人在约会后都会快乐。

要是n 和 m 不想等呢? 问题来了,然后这个时间要怎么联系起来?

我当时想不出,模拟这个约会的过程,用O(n * m) 的方法,结果被hack了一下,水爆了 = =、 看了editorial后才明白的。

好了,回到问题,要是n 和m 不想等的时候呢,假设n = 2 , m = 3,则在时间 i  = 2 后,在男生中 2%2 = 0 号男生与 2%3 = 2 号女生约会,可以把m 中的2 号女生看作一个,与 两个男生约会,问题就变成了 n = 2, m = 1, 之所以要这么做,是为了找出一个区间,这个区间满足,每个编号都有人快乐, 就像前面例a 一样。然后继续,n = 2, m = 1时,在时间i = 1 时,男生中 1 % 2 = 1 号男生与 1 % 1 = 0 号女生约会,把 n 中的1 号男生看作一个,与1个女生约会,问题就编程了
n = m = 1, 这样,就达到了之前说的一个目的,找到区间[0, 1) 要是这个内对应的编号都有人快乐,那么全部人都会快乐。先设 c 是 n 和 m 的最大公约数,在 n = 2, m = 3, i = 2 时,这样变换, n = 2, m = m % n = 1, i 在累加时也这样做,最后把问题变换为 n = m = 1, 这样,只要区间之间

[0, 1) 之间对应的编号都有人快乐,那么全部人都会快乐。是不是很像gcd,在例子a 中,因 0、1 号是快乐的,那么0 % 1 = 0,  1 % 1 = 1,会因为他们而快乐,所以,每个快乐的人的编号去模n和m的公约数,就求出因为他们而快乐的人的编号。好了,说了一大堆没有逻辑的话,该上代码了。

#include <stdio.h>
#include <iostream>
#include <map>
#include <string.h>
using namespace std; int gcd(int a, int b){
int c, d;
d = max(a, b); c = min(a, b);
if(d%c == 0) return c;
else return gcd(d%c, c);
}
int pep[101];
int main(){
int n, m, b, g, c, i, cnt = 0, id;
// freopen("e:/in.txt", "r", stdin);
memset(pep, 0, sizeof(pep));
cin >> n >> m;
c = gcd(n, m);
cin >> b;
for( i = 0; i < b; i++ ){
cin >> id;
if(!pep[id%c]) pep[id%c] = 1, cnt++;
}
cin >> g;
for( i = 0; i < g; i++ ){
cin >> id;
if(!pep[id%c]) pep[id%c] = 1, cnt++;
} if(cnt == c) cout << "Yes";
else cout << "No";
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. SNF开发平台WinForm之七-单据打印和使用说明-SNF快速开发平台3.3-Spring.Net.Framework
  2. phalcon: dispatcher调度控制器
  3. Js apply() call()使用详解
  4. 【JS】Intermediate3:AJAX
  5. C++构造函数 &amp; 拷贝构造函数 &amp; 派生类的构造函数 &amp; 虚继承的构造函数
  6. php定界符 &lt;&lt;&lt; 的作用及使用注意事项
  7. UI控件库
  8. 关于java的自动拆装箱若干细节问题
  9. code forces 436 C. Bus
  10. 逻辑卷lvm创建、扩展、缩小
  11. VK-Cup 2017 qualification 1
  12. iptables防火墙规则积累
  13. Cmd命令 查看端口被占用
  14. Django学习---快速搭建搜索引擎(haystack + whoosh + jieba)
  15. Node入门教程(10)第八章:Node 的事件处理
  16. c语言使用指针交换数值
  17. eclipse:无法删除不存在的工程
  18. __NSCFConstantString &amp;&amp; __NSPlaceholderDictionary
  19. IsPostBack用法
  20. Golang之定时器,recover

热门文章

  1. HDU 1041 Computer Transformation 数学DP题解
  2. 负样本采样及bias校准、ctr平滑
  3. Android跨进程訪问(AIDL服务)
  4. Batch update returned unexpected row count from update [0];
  5. C端端口扫描工具,发现www服务
  6. Docker 开源管理工具集锦
  7. Linux程序
  8. mysql MHA报错 Can&#39;t exec &quot;mysqlbinlog&quot;: No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 99.
  9. syslog,rsyslog and syslog-ng
  10. linux SPI驱动——spidev之driver(六)