AX BY C的解的個數

2021-07-11 03:27:14 字數 1144 閱讀 9731

目標就是求滿足ax+by<=c的(x,y)對數,即求∑x

=0∑y

=0[a

x+by

<=c]

其中1<=a,b<=1e9,c<=1e9*min(a,b),x>=0,y>=0

稍微化簡二重和式得到∑x

=0⌊c

a⌋⌊c

−a∗x

b+1⌋

很明顯,式子中的a/

b 可以把⌊a

b⌋提出,於是可以化簡為∑x

=0⌊c

a⌋⌊c

−(amodb)

∗xb+

1+⌊a

b⌋∗x

考慮歐幾里德演算法,現在我們想要把

b 放到分子中去而把

amod

b放到分母中去,這樣就可以反覆使用這種方法,但是現在還不能這麼做,因為現在

x 的範圍和

y還不對等,因而現在還不能直接交換

x 和

y,考慮題目的幾何意義,實際上就是求ax

+by<=

c 這條直線包圍了多少

x>=0,

y>=

0 的整數點,當我們把

a 轉化成a%b之後,再用原來的限制把圖畫出來,實際意義就變成了讓我們求有多少個整點在a′

x+by

=c下方且在x=

ca左邊有多少個整點,為了把問題轉化為沒有x限制的問題,我們可以把左下方的矩形單獨拿出來算,之後再把直線向下平移,問題就轉化為輸入引數為a′

,b,c

′ 的子問題,不斷迭代下去,直到a,b中某乙個是1,就可以直接計算答案,還有一些小細節,可以參考我的**

#include

using

namespace

std;

typedef

long

long ll;

ll cal(ll x)

ll solve(ll a,ll b,ll c)

ll y=(c-nxt*(c/a))/b;

ll ret=y*(c/a)-a/b*cal(c/a);

ret+=solve(b,nxt,c-b*y);

return ret;

}int main()

python 拓撲排序解的個數

給定有向無環圖中所有邊,計算圖的拓撲排序解的個數。第一行為用例個數,後面每一行表示乙個圖中的所有邊,邊的起點和終點用空格隔開,邊之間使用逗號隔開。拓撲排序解的個數。1 a c,b c,c d,d e,d f,e g,f g4因為演算法課需要,所以只好將別人 進行翻譯,暫時還沒看懂原理。基本來自對 z...

子串行的個數(解) 英雄會

本題同樣來自caopengcs,只要你有興趣,每個人都可以出題 出題入口在主頁右側邊欄 貢獻題目 我要發布 內 以下是題目詳情 子串行的定義 對於乙個序列a a 1 a 2 a n 則非空序列a a p1 a p2 a pm 為a的乙個子串行,其中1 p1 例如 4,14,2,3和14,1,2,3都...

Oracle in 引數個數超過1000的解決方案

在網上搜了一下,解決方案都是將引數分段,即select from table where id in 1,2,1000 or id in 1001,1999 但是這種方式感覺效率太低,當引數特別多的時候可能非常慢。但是這種方案是標準sql,sql拼起來也不算複雜,目前專案中就用的這種方案,畢竟引數不...