BZOJ2118 墨墨的等式(最短路 揹包)

2021-09-11 01:14:20 字數 1133 閱讀 9334

傳送門

考慮到其實這就是乙個揹包問題,但是發現b

bb的範圍太大了

考慮另外的做法

我們發現對於乙個數x

xx,如果x

xx可以湊出來,那麼x+k

ai

x+ka_i

x+kai​

顯然都可以湊出來

而且可以湊出(ma

xb−x

)/ai

+1

(maxb-x)/a_i+1

(maxb−

x)/a

i​+1

個為了讓求的量最少,我們用最小的a

ia_i

ai​那麼那現在我們也就只需要找到最小的x

xx滿足b%a

i=

xb\%a_i=x

b%ai​=

x就可以了

發現可以最短路求

那就跑spf

aspfa

spfa

求出所有最小的x

xx就可以了

#include

using

namespace std;

#define ll long long

#define re register

const ll inf=

1e13

;inline ll read()

const

int n=

500005

;int vis[n]

,a[n]

,n,mox;

ll l,r,dis[n]

;inline

void

spfa()

}}}}

inline ll calc

(ll mx)

return ans;

}int

main()

mox=

min(mox,a[i]);

}memset

(dis,

127/3,

sizeof

(dis));

spfa()

; cout<<

calc

(r)-

calc

(l-1);

}

BZOJ2118 墨墨的等式(最短路)

傳送門 好神啊。需要用非負數個a1,a2,a3.an來湊出b 可以知道,如果乙個數x能被湊出來,那麼x a1,x a2.x an也都能被湊出來 那麼我們只需要選擇a1 an中任意乙個的a,可以求出在 a下的每個數最小需要多少才能湊出來 這樣我們選擇乙個最小的a,速度更快,令m min a k 1 k...

bzoj 2118 墨墨的等式

又是好一道數論題!令mn為a 1 a n 中數的最小值。很顯然,如果x能被湊出來,x mn也能被湊出來。所以我們只需要知道對於每乙個x屬於 0,mn 滿足y mn x中最小的y,那麼就能知道 1,r 中模mn等於x的數里能湊出來的個數。注意spfa的時候正無窮要大一點 需要特殊處理一下a 0的情況,...

bzoj2118 墨墨的等式

time limit 10 sec memory limit 259 mb submit 878 solved 337 submit status discuss description 墨墨突然對等式很感興趣,他正在研究a1x1 a2y2 anxn b存在非負整數解的條件,他要求你編寫乙個程式,給...