目標就是求滿足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拼起來也不算複雜,目前專案中就用的這種方案,畢竟引數不...