description
墨墨突然對等式很感興趣,他正在研究a1
x1+a
2x2+
…+an
xn=b
a 1x
1+a2
x2+…
+anx
n=
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。
題解完全揹包拿暴力分相信大家都會,就不講了。
首先,如果我們已經湊出xi
ai+x
jaj.
..=p
x ia
i+xj
aj..
.=
p,那麼我們一定能湊出(x
i+1)
ai+x
jaj.
..=p
+ai (xi
+1)a
i+xj
aj..
.=p+
ai
,所以對於某個元素ai
a
i,設x∈
[0,a
i),p
′mod
ai=x
x ∈[
0,ai
),p′
moda
i=
x,當我們找到滿足條件的的最小的p』時,我們一定可以湊出ai
+x,2
ai+x
,3ai
+x..
. ai+
x,2a
i+x,
3ai+
x...
,進而我們就可以計算出在[1
,r] [1,
r]
中滿足對ai
a
i取模得到
x x
的數的個數。
為了減少複雜度,我們不妨把ai
' role="presentation" style="position: relative;">aia
i取為a中最小的元素am
ina mi
n。接下來我們就可以建圖,節點0∼
amin
0 ∼a
mi
n表示對am
ina mi
n取模的餘數,dis[i]表示滿足p′
moda
min=
i p′m
odam
in=i
的p』的最小值。建邊時,對於每個節點j,我們列舉所有ai
a
i,連一條j→
(j+a
i)mo
dami
n j→(
j+ai
)mod
amin
的有向邊即可。
這道題博主在洛谷上dijkstra莫名被卡,spfa加register才a掉,然而bzoj上dijkstra還比spfa快1000ms。。。
記得左區間減一。
**dijkstra:
#include
#define ll long long
using
namespace
std;
const
int m=5e5+5;
struct sd
void dijkstra()
); sd f,t;
while(!dui.empty()));}
}}
}void ac()
); dijkstra();
ll ans=0;
b1--;
for(int i=0;iif(dis[i]<=b1)ans-=(b1-dis[i])/minn+1;
if(dis[i]<=b2)ans+=(b2-dis[i])/minn+1;
}printf("%lld",ans);
}int main()
spfa:
#include
#define ll long long
#define r register
using
namespace
std;
const
int m=5e5+5;
struct sd;
ll n,b1,b2,dis[m],a[m],minn=1e17;
vector
edge[m];
bool vis[m];
queue
dui;
void in()
void spfa()}}
}void ac()
); spfa();
ll ans=0;
b1--;
for(i=0;iif(dis[i]<=b1)ans-=(b1-dis[i])/minn+1;
if(dis[i]<=b2)ans+=(b2-dis[i])/minn+1;
}printf("%lld",ans);
}int main()
國家集訓隊 墨墨的等式
墨墨突然對等式很感興趣,他正在研究 a1x1 a2x2 anxn b存在非負整數解的條件 他要求你編寫乙個程式 給定n 以及b的取值範圍 求出有多少b可以使等式存在非負整數解集訓隊的神題 怎麼看都以為是數論題,結果是同餘最短路 通過對所有數 k,跑最短路,求出在 k意義下的最小數 那麼在 k意義下的...
國家集訓隊 墨墨的等式
description 墨墨突然對等式很感興趣,他正在研究a1x1 a2y2 anxn b存在非負整數解的條件,他要求你編寫乙個程式,給定n 以及b的取值範圍,求出有多少b可以使等式存在非負整數解。input 輸入的第一行包含3個正整數,分別表示n bmin bmax分別表示數列的長度 b的下界 b...
bzoj 2118 墨墨的等式
又是好一道數論題!令mn為a 1 a n 中數的最小值。很顯然,如果x能被湊出來,x mn也能被湊出來。所以我們只需要知道對於每乙個x屬於 0,mn 滿足y mn x中最小的y,那麼就能知道 1,r 中模mn等於x的數里能湊出來的個數。注意spfa的時候正無窮要大一點 需要特殊處理一下a 0的情況,...