原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html

题目传送门 - https://www.nowcoder.com/acm/contest/148/H

题意

  有两只蚂蚁在一个二维平面上走。一开始,他们都在点 $(1,0)$ 的位置。

  Rikka 布置了三条规定:

  1. 第一只蚂蚁不能走过直线 $y=\cfrac{a}{b} x$ 。

  2. 第二只蚂蚁不能走过直线 $y=\cfrac{c}{d} y$ 。

  3. 所有蚂蚁都不能走过直线 $y=0$ 。

  每一只蚂蚁的行走方式都是一样的,即:如果能往上走,那么向上;否则向右。

  问这两只蚂蚁走过的路径上有多少个整点是重合的,如果答案为 $\infty$ ,输出 $-1$ 。

  多组数据,$T\leq 10^5,0\leq a,b,c,d \leq 10^9$ 。

题解

upd(2018-08-28): 无意中发现我之前那个 上界 的取值写错了,40多个阅读居然没人指出QAQ……

  首先,判掉无穷的情况:即斜率相同。

  然后,强制 $y=\cfrac ab x$ 的斜率比 $y=\cfrac cd x$ 大。(即,如果小了就交换)

  记 $f(x)=y_1=\cfrac ab x,g(x)=y_2=\cfrac cd x$ ,

  因此,对于一个点 $x$ ,必然有 $y_1>y_2$ 。于是,重合的整点中,横坐标为 $x$ 的点的 $y$ 坐标必然 $\leq y_2$ 。又由于 $f(x-1)>g(x-1)$ ,所以,横坐标为 $x$ 的重合的整点的 $y$ 坐标必然 $\geq\left\lfloor \cfrac{a(x-1)}{b} \right\rfloor$ 。

  于是,答案就是:

$$\begin{eqnarray*}&\sum_{x=0}^{\infty} \max\left(0,\left\lfloor\cfrac{c(x+1)}{d}\right\rfloor-\left\lfloor\cfrac{ax-b}{b}\right\rfloor\right)\\=&\sum_{x=0}^{\infty} \max\left(0,\left\lfloor\cfrac{c(x+1)}{d}\right\rfloor-\left\lfloor\cfrac{ax}{b}\right\rfloor+1\right)\end{eqnarray*}$$

  我们考虑取一个上界,来从公式中拿掉那个 $\max$ 。

  我们考虑到:

  如果我们取尽量大的 $i$ ,使得

$$\cfrac {ai}{b} \leq \cfrac{c(i+1)}{d} +1$$

  则,对于 $x>i$,显然有:

$$\left\lfloor\cfrac{c(x+1)}{d}\right\rfloor-\left\lfloor\cfrac{ax}{b}\right\rfloor+1\leq 0$$

  相反,对于 $x<i$ ,有:

$$\left\lfloor\cfrac{c(x+1)}{d}\right\rfloor-\left\lfloor\cfrac{ax}{b}\right\rfloor+1\geq 0$$

  这两个容易证明。

  那么我们就可以解得上界为 $i=\left\lfloor \cfrac{(c+d)b}{ad-bc}\right\rfloor$ ,于是,我们可以把原式写成:

$$\begin{eqnarray*}&&\sum_{x=0}^{\infty} \max\left(0,\left\lfloor\cfrac{c(x+1)}{d}\right\rfloor-\left\lfloor\cfrac{ax-b}{b}\right\rfloor\right)\\&=&\sum_{x=0}^{\infty} \max\left(0,\left\lfloor\cfrac{c(x+1)}{d}\right\rfloor-\left\lfloor\cfrac{ax}{b}\right\rfloor+1\right)\\&=&\sum_{x=0}^{i}\left(\left\lfloor\cfrac{c(x+1)}{d}\right\rfloor-\left\lfloor\cfrac{ax}{b}\right\rfloor+1\right)\\&=&\sum_{x=0}^{i}\left\lfloor\cfrac{c(x+1)}{d}\right\rfloor-\sum_{x=0}^{i}\left\lfloor\cfrac{ax}{b}\right\rfloor\ +i+1\end{eqnarray*}$$

  上面前两个 $\sum$ 是裸的类欧,直接拖一份写就可以了。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int mod=998244353;
  4. typedef long long LL;
  5. typedef __int128 LLL;
  6. LL f(LL a,LL b,LL c,LL n){
  7. if (a==0)
  8. return (b/c)%mod*((n+1)%mod)%mod;
  9. if (a>=c||b>=c)
  10. return ((LL)((LLL)a/c%mod*(n*(n+1)/2%mod))%mod
  11. +(b/c)*(n+1)%mod+f(a%c,b%c,c,n))%mod;
  12. LL tmp=((LLL)a*n+b)/c;
  13. return (tmp%mod*n%mod-f(c,c-b-1,a,tmp-1)+mod)%mod;
  14. }
  15. LL T,a,b,c,d;
  16. void write(LLL x){
  17. if (x<0){
  18. putchar('-');
  19. x=-x;
  20. }
  21. if (x>9)
  22. write(x/10);
  23. putchar('0'+x%10);
  24. }
  25. LL calc(LL x){
  26. return (f(c,c,d,x)-f(a,0,b,x)+x+1+mod)%mod;
  27. }
  28. int main(){
  29. scanf("%lld",&T);
  30. while (T--){
  31. scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
  32. if (a*d==b*c){
  33. puts("-1");
  34. continue;
  35. }
  36. if (a*d<b*c)
  37. swap(a,c),swap(b,d);
  38. printf("%lld\n",calc((c+d)*b/(d*a-c*b)));
  39. }
  40. return 0;
  41. }

  

2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法的更多相关文章

  1. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...

  2. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  3. 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...

  4. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

  5. 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...

  6. 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...

  7. 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...

  8. 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 -  https://www.n ...

  9. 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...

随机推荐

  1. Linux学习之CentOS(二)--初识linux的一些常用命令

    Linux学习之CentOS(二)--初识linux的一些常用命令 在VM上安装完了CentOS6.4以后,看着linux系统成功跑起来,心里小激动了一把......但是前方学习的道路还很遥远... ...

  2. swift 学习- 26 -- 泛型

    // 泛型 代码能够让你根据自定义的需求,编写出适用于任意类型, 灵活可重用的函数以及类型, 它能让你避免代码的重复, 用一种清晰和抽象的方式来表达代码的意图 // 泛型是 Swift 最强大的特性之 ...

  3. Confluence 6 MBeans

    你可以使用下面的 Confluence MBeans  来实时查看你 Confluence 实例运行的实时信息. CacheStatistics 这个 MBean 显示了 Confluence 有关的 ...

  4. json字符串和字典的区别补充

    json字符串和字典的区别:json:(JavaScript Object Notation)的首字母缩写,字面的意思是(javascript对象表示法),这里说的json指的是类似于javascri ...

  5. HighCharts基本使用

    一.简叙 HighCharts是一个非常强大的画图插件,在以后的工作汇报,数字展示,它将是一把利器.既然是插件,那么就有它的使用规则,我们只需要遵循它的使用规则,就可以画出我们想要的展示效果了.期待吗 ...

  6. Kali安装问题解决方案

    一.对今天安装Kalilinux  失败的原因做一个简单的总结, 1.安装之前的电脑状况,电脑配置Windows7 64位旗舰版配置,虚拟版本是VMware Workstation Pro14 ver ...

  7. hdu2196 树形dp经典|树的直径

    /* 两种做法 1.求出树直径v1,v2,那么有一个性质:任取一点u,树上到u距离最远的点必定是v1或v2 那么可以一次dfs求树v1 第二次求dis1[],求出所有点到v1的距离,同时求出v2 第三 ...

  8. Error: Java VM internal error:Error Loading javai.dll

    因为前几天的JMS测试,第一次写了loadrunner的脚本,感觉路一下子宽了. 知道loadrunner可以使用java写脚本,今天就试了一下,遇到了两个第一次写Java Vuser脚本普遍都会遇到 ...

  9. python2.7 (x64) 调用 java 代码实践

    背景:公司实施接口自动化测试,使用的框架python+unittest:因为开发使用的架构师SpringBoot,在测试过程中难免需要使用到python调用JAVA的一些接口,所以需要用到python ...

  10. python操作注册表

    #注册表操作 # -*- coding: utf-8 -*- import win32api import win32con #打开注册表:传主键化值,子键值,操作方法(win32con.KEY_AL ...