國家集訓隊 墨墨的等式

2022-09-08 18:57:10 字數 1365 閱讀 1593

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。

題目可以這樣變化一下:n個物品,可以用0-正無窮,問[l,r]區間內有多少價值可以湊出來。

聯絡到最短路上面:

任選乙個ai>0,如果乙個價值k∗ai+x(0≤x顯然如果我們對於每個x都找到最小的k滿足k∗ai+x可以被湊出來,這個問題就解決了,

如果滿足湊出x的最小花費是大於b的,那麼就不能在[l,r]區間內湊出mn*k+x,這個數了,

否則的話,就計算[l,r]內有多少個可以湊出來。

最短路,spfa 時間複雜度o(n∗ai∗log2ai) 因為複雜度與ai有關,所以我們就選擇最小的ai了,

舉個例子:當最小的ai等於1時,那麼自然區間內的所有數都可以湊出來了。

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const ll inf=9e18;

const

int n=5e5+5

;int q[n],mn,n,a[20

];ll dis[n];

bool

vis[n];

void

spfa()}}

vis[x]=0

; }

}ll query(ll x)

/*windows 用i64d linux 用lld

*/int

main()

mn=min(mn,a[i]);

}/*取出最小的an,但是不能為0,很好理解吧

*/for (int i=1;i/*

設達到每個k*mn+i(i*/

spfa();

printf(

"%lld\n

",query(r)-query(l-1

));

return0;

}

國家集訓隊 墨墨的等式

墨墨突然對等式很感興趣,他正在研究 a1x1 a2x2 anxn b存在非負整數解的條件 他要求你編寫乙個程式 給定n 以及b的取值範圍 求出有多少b可以使等式存在非負整數解集訓隊的神題 怎麼看都以為是數論題,結果是同餘最短路 通過對所有數 k,跑最短路,求出在 k意義下的最小數 那麼在 k意義下的...

BZOJ2118 國家集訓隊 墨墨的等式

description 墨墨突然對等式很感興趣,他正在研究a1 x1 a 2x2 an xn b a 1x 1 a2 x2 anx n b存在非負整數解的條件,他要求你編寫乙個程式,給定n 以及b的取值範圍,求出有多少b可以使等式存在非負整數解。input 輸入的第一行包含3個正整數,分別表示n b...

P2371 國家集訓隊 墨墨的等式

p2371 國家集訓隊 墨墨的等式 同餘最短路,考慮直接用最小的代價拼出來在膜最小 a i 意義下的餘數。然後不停地累加最小的 a i 一下稱它 a 就行了。正確性 假定 i,j,k 為膜 a 下的餘數,令 i j equiv k mod a 那麼顯然 i j t cdot a k t 為任意非負整...