首页 > 代码库 > [Codeforces Round #275 (Div. 2)]B - Friends and Presents
[Codeforces Round #275 (Div. 2)]B - Friends and Presents
最近一直在做 codeforces ,总觉得已经刷不动 BZOJ 了? ——真是弱喵
你看连 Div.2 的 B 题都要谢谢题解,不是闲就是傻
显然我没那么闲 ╮(╯_╰)╭
我觉得这题的想法挺妙的~
大意是你需要分别给 a 和 b cnt1 和 cnt2 个数字
但是 a 不要被 x 整除的数 ,as well as,b 不要被 y 整除的数
然后求需要给的最大数的最小值——
最值的最值?那不是典型的二分吗?
但是——坑爹的英文题导致我完全没有意识到这一点……
二分答案 v ,因为 a 不要被 x 整除的数,所以我们可以
先把 被 x 整除的数但不被 y 整除 给b,
再把 被 y 整除的数但不被 x 整除 给a。
然后剔除所有被 a*b 整除的数
剩下的数与 a 和 b 都互素,判一下能不能好好的分配就可以了
代码很好写哦
1 #include <cstdio> 2 #include <cstring> 3 4 int cnt1, cnt2, x, y; 5 inline int getint(); 6 inline void putint(long long); 7 inline bool check(long long); 8 9 int main()10 {11 long long l, r, m;12 13 cnt1=getint(), cnt2=getint(), x=getint(), y=getint();14 l=0, r=0x0FFFFFFFFFFFFFFFLL;15 while (l+1<r)16 {17 m=(l+r)>>1;18 if (check(m)) r=m;19 else l=m;20 }21 putint(r);22 23 return 0;24 }25 inline int getint()26 {27 register int num=0;28 register char ch;29 do ch=getchar(); while (ch<‘0‘ || ch>‘9‘);30 do num=num*10+ch-‘0‘, ch=getchar(); while (ch>=‘0‘ && ch<=‘9‘);31 return num;32 }33 inline void putint(long long num)34 {35 char stack[22];36 register int top=0;37 for ( ;num;num/=10) stack[++top]=num%10+‘0‘;38 for ( ;top;top--) putchar(stack[top]);39 putchar(‘\n‘);40 }41 inline bool check(long long num)42 {43 long long u=num/x, v=num/y, w=num/(x*y);44 long long c1=cnt1, c2=cnt2;45 c1-=v-w; c2-=u-w;46 if (c1<0) c1=0; if (c2<0) c2=0;47 if (c1+c2>num-u-v+w) return false;48 return true;49 }
[Codeforces Round #275 (Div. 2)]B - Friends and Presents
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。