bzoj2118 墨墨的等式

2021-08-07 07:56:53 字數 1235 閱讀 6714

description

墨墨突然對等式很感興趣,他正在研究a1x1+a2y2+…+anxn=b存在非負整數解的條件,他要求你編寫乙個程式,給定n、、以及b的取值範圍,求出有多少b可以使等式存在非負整數解。

input

輸入的第一行包含3個正整數,分別表示n、bmin、bmax分別表示數列的長度、b的下界、b的上界。輸入的第二行包含n個整數,即數列的值。

output

輸出乙個整數,表示有多少b可以使等式存在非負整數解。

sample input

2 5 10

3 5sample output

hint

對於100%的資料,n≤12,0≤ai≤5*10^5,1≤bmin≤bmax≤10^12。

題解 首先取出最小的ai,設為p。那麼考慮令d[i]表示當物體的總重%p=i時,物體最少的重量。設d[i]=t,那麼顯然對於所有的x,如果x%p=i且x>=t,都可以用總重最少的那個方案再加上若干個p得到。

同時,考慮加入乙個物體u,那麼顯然有d[(i+u)%p]可以由d[i]+u得到,這不就是兩點間連邊嗎?d[i]求最小值不就是最短路嗎?

所以無限揹包求可行方案數就轉化成最短路問題

**

#include

#define n 1005

#define ll long long

#define mo 1000000007

#define pa pair

using

namespace

std;

inline ll read()

while(ch>='0'&&ch<='9')

return x*f;

}int tot,ret[6000005],next[6000005],len[6000005],head[500005];

int n,a[15],mod=10000000;

ll dis[500005];

ll ans,bmin,bmax;

bool vis[500005];

inline

void ins(int u,int v,int l)

void dijkstra()

}}int main()

sort(a+1,a+n+1);

memset(head,-1,sizeof(head));

for (int i=1;i<=n;i++)

cout

0;}

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存在非負整數解的條件,他要求你編寫乙個程式,給...

BZOJ 2118 墨墨的等式

這道題太tm神了。智商 啊 好題啊!找乙個ai,若x為合法的b,則x ai也合法 設bi為最小的x,滿足x mod mn i 求出每個bi就可以求答案了 bi用最短路求就好了啊 意會一下 最後列舉餘數搞一下就算出答案了 好短啊2333 include using namespace std type...