1. 程式人生 > >Newcoder 148 H.Rikka with Ants(計算幾何+遞迴)

Newcoder 148 H.Rikka with Ants(計算幾何+遞迴)

Description

二維平面上有兩隻螞蟻初始在(1,0)(1,0)點,有三條直線:

1.y=01.y=0,沒有螞蟻可以越過這條線

2.y=abx(a,b>0)2.y=\frac{a}{b}x(a,b>0),只有第二隻螞蟻可以越過這條線

3.y=cdx(c,d>0)3.y=\frac{c}{d}x(c,d>0),只有第一隻螞蟻可以越過這條線

注意到螞蟻只能往上走和往右走,且如果螞蟻可以往上走就先往上走,不能往上走了再往右走,故兩隻螞蟻的路徑唯一,問被兩隻螞蟻均經過的整點個數

Input

第一行一整數TT表示用例組數,每組用例輸入四個整數a,b,c,da,b,c,d

(1T105,1a,b,c,d109)(1\le T\le 10^5,1\le a,b,c,d\le 10^9)

Output

如果兩隻螞蟻均經過的整點有無限個則輸出1-1,否則輸出整點個數,結果模998244353998244353

Sample Input

5 1 1 1 1 1 2 1 1 1 3 2 1 1 100 1 99 12 34 56 78

Sample Output

-1 2 1 5049 3

Solution

顯然若兩條直線重合則兩隻螞蟻均經過的整點有無窮個,假設ab>cd\frac{a}{b}>\frac{c}{d},兩隻螞蟻若都經過(x,y)(x,y)點,那麼螞蟻要麼從(x,y1)(x,y-1)往上走到達(x,y)(x,y)點,要麼從(x1,y)(x-1,y)點無法到達(x1,y+1)(x-1,y+1)點只能往右走到達(x,y)(x,y)點,故有 {yabxycdxy+1>ab(x1)y+1>cd(x1) \left\{ \begin{array}{lcl} y\le \frac{a}{b}x\\ y\le \frac{c}{d}x\\ y+1>\frac{a}{b}(x-1)\\ y+1>\frac{c}{d}(x-1)\\ \end{array} \right.

ab>cd\frac{a}{b}>\frac{c}{d}知只需滿足2,32,3式即可,問題轉化為求y=cdxy=\frac{c}{d}xy+1=ab(x1)y+1=\frac{a}{b}(x-1)xx軸圍成三角形中整點的個數(不包括原點以及y+1=ab(x1)y+1=\frac{a}{b}(x-1)上的整點),這顯然是有窮個點,假設兩條直線內整點橫座標最大值為XX,則輕易得到 X=(a+b)dadbc X=\lfloor\frac{(a+b)d}{ad-bc}\rfloor 那麼我們只要求出y=cdxy=\frac{c}{d}xx[1,X]x\in [1,X]範圍內與xx軸圍成整點的個數,再減去y+1=ab(x1)y+1=\frac{a}{b}(x-1)x[1,X]x\in [1,X]範圍內與xx軸圍成的縱座標非負的整點個數即為答案

對於第一部分,顯然有 X+x=1Xcxd X+\sum\limits_{x=1}^X\lfloor\frac{cx}{d}\rfloor 對於第二部分,先把直線向左平移一個單位,然後想上平移一個答案,則第二部分答案等價於y=abxy=\frac{a}{b}xx[0,X1]x\in [0,X-1]範圍內與xx軸圍成的縱座標為正的整點個數,也即為 x=0X1axb \sum\limits_{x=0}^{X-1}\lfloor\frac{ax}{b}\rfloor f(a,b,c,n)=x=0nax+bcf(a,b,c,n)=\sum\limits_{x=0}^n\lfloor\frac{ax+b}{c}\rfloor,則所求答案為X+f(c,0,d,X)f(a,0,b,X1)X+f(c,0,d,X)-f(a,0,b,X-1),只要求出ff即可

1.若a=0a=0,則顯然f(a,b,c,n)=(n+1)bcf(a,b,c,n)=(n+1)\cdot \lfloor\frac{b}{c}\rfloor

2.若a,ba,b不全小於cc,那麼把這個下取整的兩塊整數拿出來,也即 ax+bc=acx+bc+(a%c)x+b%cc \lfloor\frac{ax+b}{c}\rfloor=\lfloor\frac{a}{c}\rfloor \cdot x+\lfloor\frac{b}{c}\rfloor+\lfloor\frac{(a\%c)\cdot x+b\%c}{c}\rfloor 進而有 f(a,b,c,n)=f(a%c,b%c,c,n)+n(n+1)2ac+(n+1)bc f(a,b,c,n)=f(a\%c,b\%c,c,n)+\frac{n(n+1)}{2}\cdot \lfloor\frac{a}{c}\rfloor+(n+1)\cdot \lfloor\frac{b}{c}\rfloor 3.若0<a<c,0b<c0<a<c,0\le b<c,回到該式的幾何意義,即為直線y=ax+bcy=\frac{ax+b}{c}x[0,n]x\in [0,n]範圍內與xx軸圍成的區域中縱座標為正的整點個數,由於bc<1\frac{b}{c}<1,故該範圍沒有橫座標x=0x=0的整點,記該區域整點縱座標最大值為mm,則有 m=an+bc m=\lfloor\frac{an+b}{c}\rfloor 對於[1,n]×[1,m][1,n]\times [1,m]範圍內的nmnm個整點,不合法整點為直線y=ax+bcy=\frac{ax+b}{c}yy軸圍成的、橫座標為正且不在直線上的整點,這些整點也即為y=ax+b1cy=\frac{ax+b-1}{c}yy軸圍成的橫座標為正的整點個數,交換兩個座標軸即為y=cxb1ay=\frac{cx-b-1}{a}

相關推薦

Newcoder 148 H.Rikka with Ants計算幾何+

Description 二維平面上有兩隻螞蟻初始在(1,0)(1,0)(1,0)點,有三條直線: 1.y=01.y=01.y=0,沒有螞蟻可以越過這條線 2.y=abx(a,b>0)2.y

Newcoder 148 E.Rikka with Equation數論+莫比烏斯反演

Description 對於一個長度為nnn的正整數序列AAA和一個正整數mmm,定義f(A,m)f(A,m)f(A,m)為滿足同餘方程 ∑i=1nAixi≡0(modm) \sum\limits_{i=1}^n A_ix_i\equiv 0(mod\ m) i

Newcoder 148 A.Rikka with Lowbit水~

Description 給出一個長度為nnn的序列,定義操作f(x)f(x)f(x),0.50.50.5概率把f(x)=x−lowbit(x)f(x)=x-lowbit(x)f(x)=x−lowbit(

Newcoder 148 I.Rikka with Zombies樹形DP

Description 給出一棵nnn個節點的樹,再給出mmm只殭屍的位置xix_ixi​以及能力hih_ihi​,第iii條邊可以等概率建立起高度為[li,ri][l_i,r_i][li​,ri​]的圍牆,第iii只殭屍可以越過任何小於hih_ihi​的圍牆,

Newcoder 148 J.Rikka with Nickname二分

Description 給出nnn個字串,要求用這nnn個字串構成一個新字串,構造方式如下:初始為空串,之後依次放入字串,對於當前要放入的字串,去掉其最長的字首使得該字首是當前已經構造的字串的子序列,之

Newcoder 148 D.Rikka with Prefix Sum組合數學

Description 給出一個長度為nnn的序列AAA,初始為000,有mmm次操作,操作分三種: 1LRw:1\ L\ R\ w:1LRw:區間[L,R][L,R][L,R]均加上www 2:2:2

2017多校賽 1002 Rikka with StringAC自動機+狀壓

這個題目和之前做的一道題目很像:類似的題目 對於題目要求列舉到2L長度的串,由於01串本身的性質我們只用列舉到L就行了,那一半是對稱的。在列舉這一半時是可以隨便列舉的,因為這一般確定了,那麼另一半也確定了,這樣2L的串一定是個01串。 然後對於輸入的n個串做

HDU 6416 2018HDU多校賽 第九場 Rikka with Seamdp + 字首和優化

大致題意:給你一個n*m的01矩陣,現在要讓你每一行和每一列都去掉一個數字,而且要求相鄰兩行之間去掉數字的位置的絕對值要小於等於k。現在問你刪除之後的矩形最多有幾種。 首先,我們一行一行考慮,對於同一行,顯然是看有多少個塊,有多少個塊就有多少個方案。然後對於

HDU 5120 Intersection計算幾何+容斥

Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The following figures are some famous examples you may know.  A ri

Wall HDU1348計算幾何+凸包

Input The first line of the input file contains two integer numbers N and L separated by a space. N (3 <= N <= 1000) is the number of vertices

[POJ2826]An Easy Problem?!計算幾何-細節/距離

題目: 我是超連結 題意: 給出兩條線段,雨水從空中豎直落下,問線段上能積多少水。 題解: 一道特判超~~~多的題目,下見註釋咯 這道題精度會有-0.00?!加個fabs吧。 這題的題解。。。真是敷衍啊 那就加個對於距離的講解吧,雖然這個

二叉樹遍歷迴圈和

遞迴 1.前序遍歷 void preorder(BinTree *T) { if(T==NULL) return; cout << T->data; preorder(T->left); preorder(T->rig

全排列next_permutation,

#include<iostream> #include<cstdio> #include<algorithm> using namespace std; in

LIS 最長上升子序列 n*logn 模板 二分查詢+

      最長上升子序列是很早就接觸了的問題了,一直用的是動態規劃n*n的方法,也知道那不是最好的,可以優化,今天看部落格無意中看到LIS,LCS兩個詞,就特意找了部落格看了看,主要是理解一下這裡的思想,其實蠻複雜難懂的,自己很難說清楚,還是得引用人家的部落格才行。點選開

單鏈表反轉Java實現

要求很簡單,輸入一個連結串列,反轉連結串列後,輸出新連結串列的表頭。使用遞迴實現 package com.lyh.seckill.test; public class ReLinkedList { private static class Node{ pri

淺顯易懂講解——動態規劃記憶化

1、動態規劃        什麼時候使用動態規劃呢?        Those who cannot remember the past well are condemned to repeat it.        所以動態規劃非常適合解決那些具有相同步驟的事(相同子

洛谷p1010冪次方分治加

洛谷p1010冪次方(分治加遞迴)題目連結 方法一:分治加遞迴 程式碼如下 #include<cstdio> #include<iostream> const int maxx=50; using namespace std; int number[maxx]

【C語言】斐波那契數列的兩種演算法迴圈,

#include<stdio.h> int Fabio(int n) //迴圈 { int i; int f1 = 1; int f2 = 1; int f3 = 1; for(i = 2;i<n;i++) { f3 = f1 + f

裴波那契數列迴圈實現

裴波那契(Fibonacci)數列 f(n)=⎧⎩⎨0,1,f(n−1)+f(n−2),n =0n =1n>1 求裴波那契數列的第n項。(題目來自劍指offer) 1.遞迴解法,效率很低的解法,不用 一看到這個題,我們就很容易竊喜的想到這種解法