令$d=\gcd(n,m)$,存在$x$和$y$使得$xn+i=ym+j$的充要条件是$i\equiv j(mod \ d)$,因此将$xd+i$(其中$0\le i<d$)作为一组,共有$d$组,根据上述结论任意两组之间相互独立
若一组中没有快乐的人,由于独立性必然无解,即有解需要$且\forall 0\le i<d,\exists t\in x\cup y且t\equiv i(mod\ d)$,必要条件为$d\le b+g$(以下记$b+g$为$N$来表示复杂度),因此可以对每一组分别求出天数$t_{i}$,则有$ans=\max_{0\le i<d}t_{i}d+i$(以下子问题中仍用$ans$来表示$t_{i}$)
对于子问题,显然有$\gcd(n,m)=1$,再不妨假设$n\ge m$($n<m$交换即可),则若第$t\ge m$天所有男生都快乐,所有女生必然快乐
证明:对于前$m$天,对$m$取模构成完全剩余系,即每个女生恰好出现一次;对$n$取模构成剩余系,即男生各不相同
反证法,若某个女生不快乐,其和其对应的男生必然都不快乐,而到第$t$天那个男生仍然不快乐,不符合假设
由此,$ans$即为最后一个快乐的男生的时间或$ans<m$,后者特判一下即可
若第$t$天且女生$i$(其中$i\equiv t(mod\ m)$)快乐,则男生$j$(其中$j\equiv t(mod\ n)$)必然快乐,而类似的可以证明女生$i$快乐等价于男生$(j+n-m)\ mod\ n$快乐的,因此不妨看作:若第$t$天且男生$(i+n-m)\ mod\ n$快乐,则男生$i$必然快乐
还需要考虑初始状态,若初始女生$i$快乐且男生$i$不快乐,可以看作男生$i$快乐(以下就用$S=x\cup y$来表示初始快乐的集合)
考虑建图:将$((i+n-m)\ mod\ n,i)$连边,由于$\gcd(n,m)=1$,因此这必然是一个大小为$n$的环,每一个初始的点影响其后面的若干个数(直到下一个初始的点),即$ans=\max_{t\in S}(t+m\cdot \min_{k>0,(t+km)\ mod\ n\in S}(k-1))$
考虑后面这个$\min$:若枚举最终结果$t'=(t+km)\ mod\ n$,即求同余方程$t+km\equiv t'(mod\ n)$的最小正整数解:用exgcd求出$km\equiv 1(mod\ n)$的最小正整数解$k'$(预处理),原方程最小正整数解即为$(k'(t'-t+n)+n-1)\ mod\ n+1$
先特判$t'=t$的情况,当$|S|=1$时才会选择这一个,因此解即$k'(t'-t+n)\ mod\ n=(k't'-k't+k'n)\ mod\ n$,那么将所有数按照$kt'\ mod\ n$排序并找到之后的那个数即可,复杂度$o(\log_{2}n+N\log_{2}N)$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define ll long long
5 int n,m,d,kk,b[N],g[N],vb[N],vg[N],v[N<<1];
6 ll ans;
7 bool cmp(int x,int y){
8 return (x%d<y%d)||(x%d==y%d)&&(x<y);
9 }
10 int exgcd(int x,int y,int &a,int &b){
11 if (!y){
12 a=1;
13 b=0;
14 return x;
15 }
16 int g=exgcd(y,x%y,b,a);
17 b-=(x/y)*a;
18 return g;
19 }
20 ll calc(){
21 bool flag=(n<=vb[0]+vg[0]);
22 ll ans=-1;
23 if (flag){
24 for(int i=0,j=1,k=1;i<n;i++){
25 if (((j>vb[0])||(vb[j]!=i))&&((k>vg[0])||(vg[k]!=i))){
26 flag=0;
27 break;
28 }
29 if ((i<m)&&((j>vb[0])||(vb[j]!=i)||(k>vg[0])||(vg[k]!=i)))ans=i;
30 if ((j<=vb[0])&&(vb[j]==i))j++;
31 if ((k<=vg[0])&&(vg[k]==i))k++;
32 }
33 if (flag)return ans;
34 ans=0;
35 }
36 v[0]=0;
37 for(int i=1;i<=vb[0];i++)v[++v[0]]=1LL*vb[i]*kk%n;
38 for(int i=1;i<=vg[0];i++)v[++v[0]]=1LL*vg[i]*kk%n;
39 sort(v+1,v+v[0]+1);
40 if (v[1]==v[v[0]])return 1LL*v[1]*m%n+1LL*(n-1)*m;
41 ans=1LL*v[v[0]]*m%n+((v[1]-v[v[0]]+1LL*kk*n)%n-1)*m;
42 for(int i=1;i<v[0];i++)
43 if (v[i]!=v[i+1])ans=max(ans,1LL*v[i]*m%n+((v[i+1]-v[i])%n-1LL)*m);
44 return ans;
45 }
46 int main(){
47 scanf("%d%d",&n,&m);
48 d=exgcd(n,m,b[0],g[0]);
49 n/=d;
50 m/=d;
51 if (n>m)kk=(g[0]%n+n)%n;
52 else kk=(b[0]%m+m)%m;
53 scanf("%d",&b[0]);
54 for(int i=1;i<=b[0];i++)scanf("%d",&b[i]);
55 scanf("%d",&g[0]);
56 for(int i=1;i<=g[0];i++)scanf("%d",&g[i]);
57 if (d>b[0]+g[0]){
58 printf("-1");
59 return 0;
60 }
61 sort(b+1,b+b[0]+1,cmp);
62 sort(g+1,g+g[0]+1,cmp);
63 if (n<m)swap(n,m);
64 for(int i=0,j=1,k=1;i<d;i++){
65 vb[0]=vg[0]=0;
66 while ((j<=b[0])&&(b[j]%d==i))vb[++vb[0]]=b[j++]/d;
67 while ((k<=g[0])&&(g[k]%d==i))vg[++vg[0]]=g[k++]/d;
68 if ((!vb[0])&&(!vg[0])){
69 printf("-1");
70 return 0;
71 }
72 ans=max(ans,calc()*d+i);
73 }
74 printf("%lld",ans);
75 }

[cf516E]Drazil and His Happy Friends的更多相关文章

  1. CodeForces 515C. Drazil and Factorial

    C. Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  2. CodeForces 515B. Drazil and His Happy Friends

    B. Drazil and His Happy Friends time limit per test 2 seconds memory limit per test 256 megabytes in ...

  3. Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树

    C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...

  4. Codeforces Round #292 (Div. 1) B. Drazil and Tiles 拓扑排序

    B. Drazil and Tiles 题目连接: http://codeforces.com/contest/516/problem/B Description Drazil created a f ...

  5. [codeforces 516]A. Drazil and Factorial

    [codeforces 516]A. Drazil and Factorial 试题描述 Drazil is playing a math game with Varda. Let's define  ...

  6. CF Drazil and Factorial (打表)

    Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  7. CF Drazil and His Happy Friends

    Drazil and His Happy Friends time limit per test 2 seconds memory limit per test 256 megabytes input ...

  8. CF Drazil and Date (奇偶剪枝)

    Drazil and Date time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  9. Codeforces Round #292 (Div. 1) - B. Drazil and Tiles

    B. Drazil and Tiles   Drazil created a following problem about putting 1 × 2 tiles into an n × m gri ...

随机推荐

  1. 使用 PyTorch Lightning 将深度学习管道速度提高 10 倍

    ​  前言  本文介绍了如何使用 PyTorch Lightning 构建高效且快速的深度学习管道,主要包括有为什么优化深度学习管道很重要.使用 PyTorch Lightning 加快实验周期的六种 ...

  2. VMware Tanzu社区版初体验

    VMware Tanzu社区版 VMware Tanzu Community Edition 是一个功能齐全.易于管理的 Kubernetes 平台,供学习者和用户使用. 它是一个免费的.社区支持的. ...

  3. RabbitMQ延时队列应用场景

    应用场景 我们系统未付款的订单,超过一定时间后,需要系统自动取消订单并释放占有物品 常用的方案 就是利用Spring schedule定时任务,轮询检查数据库 但是会消耗系统内存,增加了数据库的压力. ...

  4. (课内)信安数基RSA-level3-5

    emmmm感觉其实自己对这个的理解完全不够,原理只能写出这么个东西(悲) 代码完全是 攻击方式中(1)(2)内容的实现. lambda是一种可以理解为匿名函数的写法:写在这里看起来很酷炫(bushi) ...

  5. python jinja2初见

    吸取了长城杯的教训,学习python-web迫在眉睫. 正常难度的python_template_injection,由于现在没学面向对象,理解原理比较困难,所以先使用简单版复现:并附上正常版的常用p ...

  6. CQL和SQL的CRUD操作比较

    数据进行CRUD操作时,CQL语句和SQL语句的异同之处. 1.建表 2.CRUD语句比较 3.总结 1.建表 在此之前先分别创建两张表,插入数据,用来测试然后进行比较 在SQL数据库里面创建表 在C ...

  7. 剑指offer:JZ8 二叉树的下一个结点

    JZ8 二叉树的下一个结点 描述 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针.下图为一棵有9个节点的二叉 ...

  8. Scrum Meeting 13

    第13次例会报告 日期:2021年06月05日 会议主要内容概述: 团队成员均明确了下一步的目标,进度突飞猛进辣 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下 ...

  9. [软工顶级理解组] Alpha阶段团队贡献分评分

    评分总表 下述表格适用于前端.后端.爬虫开发者的评分,基础分数为50分,在此基础上进行增减. 类别 程度 加减分 准时性 提前完成 +0 按时完成 +0 延后完成,迟交时间一天内或未延误进度 -2 延 ...

  10. zip和flatMap没有生效

    在Reactor 中flatMap和zip等没有生效 1.一个简单的示例代码如下: 2.示例运行结果 3.得到结论 最近在项目中使用了 Project Reactor ,但发现代码在写着写着有些地方没 ...