原文链接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$ 是裸的类欧,直接拖一份写就可以了。

代码

#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
typedef long long LL;
typedef __int128 LLL;
LL f(LL a,LL b,LL c,LL n){
if (a==0)
return (b/c)%mod*((n+1)%mod)%mod;
if (a>=c||b>=c)
return ((LL)((LLL)a/c%mod*(n*(n+1)/2%mod))%mod
+(b/c)*(n+1)%mod+f(a%c,b%c,c,n))%mod;
LL tmp=((LLL)a*n+b)/c;
return (tmp%mod*n%mod-f(c,c-b-1,a,tmp-1)+mod)%mod;
}
LL T,a,b,c,d;
void write(LLL x){
if (x<0){
putchar('-');
x=-x;
}
if (x>9)
write(x/10);
putchar('0'+x%10);
}
LL calc(LL x){
return (f(c,c,d,x)-f(a,0,b,x)+x+1+mod)%mod;
}
int main(){
scanf("%lld",&T);
while (T--){
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
if (a*d==b*c){
puts("-1");
continue;
}
if (a*d<b*c)
swap(a,c),swap(b,d);
printf("%lld\n",calc((c+d)*b/(d*a-c*b)));
}
return 0;
}

  

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. EasyUI tree 选中父节点子节点全部选中,选中子节点父节点不选中

    需求:EasyUI tree 选中父节点子节点全部选中,选中子节点父节点不选中 效果:   /**   * 给树增加onCheck事件,首先使用cascadeCheck:false属性禁止全选,   ...

  2. [转]PHP中file_put_contents追加和换行

    在PHP的一些应用中需要写日志或者记录一些信息,这样的话. 可以使用fopen(),fwrite()以及 fclose()这些进行操作. 也可以简单的使用file_get_contents()和fil ...

  3. Cropper.js使用笔记

    官网:https://fengyuanchen.github.io/cropperjs/ github:https://github.com/fengyuanchen/cropperjs 由于文档不好 ...

  4. PID控制器开发笔记之十:步进式PID控制器的实现

    对于一般的PID控制系统来说,当设定值发生较大的突变时,很容易产生超调而使系统不稳定.为了解决这种阶跃变化造成的不利影响,人们发明了步进式PID控制算法. 1.步进式PID的基本思想 所谓步进式PID ...

  5. 一种基于NTC的控温电路及软件实现

    NTC(Negative Temperature Coefficient)是一种随温度上升时,电阻值呈指数关系减小的热敏电阻.应用广泛,最近我们就采用了NTC来控制加热并测温,并达到了预期的效果. 1 ...

  6. JS跨域ajax访问

    方式1:jsonp解决跨域访问 需要服务和js配合 服务 [WebMethod] public void HelloWorld2(string name) { HttpContext.Current. ...

  7. Confluence 6 代理和 HTTPS 详细配置指南链接

    详细配置指南 更多有关连接器示例,我们提供了一些按步骤配置的指南来帮助你启用 HTTPS 并正确配置你的代理. HTTPS: Running Confluence Over SSL or HTTPS  ...

  8. 刚发了两个关于极光推送的网上Demo,再次自己结合官网总结一下,以便加深印象

    简单源码如下: //Map<String, String> parm是我自己传过来的参数,同学们可以自定义参数public static void jpushAndroid(Map< ...

  9. 不显示TensorFlow加速指令警告

    vim ~/.bashrc 在打开的文件中追加: export TF_CPP_MIN_LOG_LEVEL= 最后再执行 source ~/.bashrc

  10. zookeeper都有哪些使用场景

    分布式协调 这个其实是zk很经典的一个用法,比如,A系统发送个请求到mq,然后B拿到消息消费之后处理了.那A系统如何知道B系统的处理结果? 用zk就可以实现分布式系统之间的协调工作.A系统发送请求之后 ...