2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接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 类欧几里德算法的更多相关文章
- 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
- 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...
- 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...
- 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...
- 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...
随机推荐
- linux下export命令添加、删除环境变量(转载)
转自:http://blog.csdn.net/shenshendeai/article/details/49794699 export命令 功能说明:设置或显示环境变量. 语 法:export [- ...
- 【原创】Linux基础之chkconfig systemd
CentOS6服务用chkconfig控制,CentOS7改为systemd控制 1 systemd systemd is a suite of basic building blocks for a ...
- 腾讯云CVM之间配置免密钥登录
背景: 1客户A和B俩台主机之间需要实现免密钥登录,已绑定腾讯云申请的密钥对 系统:centos7.3 A:192.168.0.100 B:192.168.0.84 A主机的私钥文件:aaa B主机的 ...
- Android之androidmainfest.xml配置文件详解
写配置文件的时候我们会不知道把那些配置项放在哪里,请看: 配置文件样例: <?xml version="1.0" encoding="utf-8"?> ...
- Java感情
不知道怎么会执着于这一门语言.论速度的话,c那系更好一些,而且对底层的操控更多是c那边的.还是想通过Java做这些事. 对Java不怎么懂,它的底层实现是怎样的.只知道一个大体的思想,不知道具体步骤. ...
- Confluence 6 删除垃圾内容
属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL. 如果你有很多垃圾用户在你的系统中创建了属性,你可以使 ...
- Metasploit (二)
1.测试一台搭建的主机 msf > db_nmap -n -A 10.140.110.16[*] Nmap: Starting Nmap 7.60 ( https://nmap.org ) at ...
- Winhex数据恢复笔记(五)
一.上次介绍了Windows API函数,这次对Windows API函数的参数做个笔记 1.IpFileName: 文件名指针,也可指向 MS-Dos设备名,同时支持文件和设备名,函数分为两个版本 ...
- hdu4990 转移矩阵
找了半天错发现m有可能是1.. /* 如果n是奇数,就进行(n/2)次转移,然后取F[2],反之取F[1] */ #include<bits/stdc++.h> using namespa ...
- cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈
/* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数 ...