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 為任意非負整...