某巨魔突然對等式很感興趣,他正在研究 a1
x1+a
2x2+
…+an
xn=b
存在非負整數解的條件。
他要求你編寫乙個程式,給定
n 、an
、以及
b 的取值範圍,求出有多少
b可以使等式存在非負整數解。
輸入的第一行包含
3 個正整數,分別表示 n、
bmin
、bma
x 分別表示數列的長度、
b 的下界、
b的上界。
輸入的第二行包含
n 個整數,即數列 an
的值。輸出乙個整數,表示有多少
b 可以使等式存在非負整數解。
2 5 10對於 b=3 5
5,式子有 x1
=0,x2=
1 。
對於 b=6
,式子有 x1
=2,x
2=0 。
對於 b=7
,無解。
對於 b=8
,式子有 x1
=1,x2=
1 。
對於 b=9
,式子有 x1
=3,x2=
0 。
對於 b=10
,式子有 x1
=0,x2=
2 。20%
的資料,n≤
5 ,1≤
bmin
≤bma
x≤10 。 40%
的資料,n≤
10 ,1≤
bmin
≤bma
x≤106
。 100%
的資料,n≤
12 ,0≤
ai≤4
∗105 ,1≤
bmin
≤bma
x≤1012
。因為
b 的範圍很大,所以我們考慮將其取模。
對於模 a1
的完全剩餘系中的每乙個元素
y ,若能找到最小的能夠表示為 m=
∑i=2
naix
i且 mm
oda1
=y的
m ,則對於範圍內的任意乙個與
y關於模 a1
同餘的
b 都滿足 b=
ka1+
m則對於每乙個
y ,可以算出範圍內的與
y關於模 a1
同餘的
b 的個數為⌊b
max−
ma1⌋
−max
(⌈bm
in−m
a1⌉,
0)+1
那麼,如何求出
m 呢? ∵m
≡y(moda1
)∴m−
y=ka
1 ∴∑
i=2n
aixi
−ka1
=y現已知 y1
,列舉 ak
,則可以更新 (y
1+ak
)mod
a1: 設 fi
表示 i 所對應的
m要變成
i 需要減去多少個 a1
。 則f(
y1+a
k)mo
da1=
fy1+
((y1
+ak)
要變成(
(y1+
ak)m
oda1
)需要減
去多少個
a1)
這就是乙個最短路模型,每次用 sp
fa更新當前元素所能更新的元素。
#include
#include
#include
#include
#include
#include
#define ll long long
#define max(x,y) ((x)>(y)?(x):(y))
using
namespace
std;
ll n,bmi,bma,ans;
ll a[20],dis[400010];
bool in_stack[400010];
queue
q;void spfa()
if(dis[tmp]==-1||dis[tmp]>dis[now]+qq)}}
}}int main()
printf("%lld\n",ans);
return
0;}
我真的不想寫背景
某巨魔有一風扇,長得和下圖乙個慫樣。這風扇原來有 n 個等分葉片,順時針編號 1到 n 誰是編號 1這不重要 任意兩個相鄰的葉片間隔相等,大小質地相同。這個 n 滿足 n pa q b,p q為質數,a b為自然數。風扇一開始還不錯,但是到後來風扇開始報復社會了。它的葉片從窗戶甩了出去甩到了大街上,...
我已經不想寫演算法了
終於可以在辦公室寫程式了 但是回來卻比以前累了 又到一年招聘時,部落格上好多 面經 宛如昨日。缺少大型專案經驗,缺乏 實踐,課程學習不紮實,不熟練,都可能導致在面試中被刷掉。當然,這裡的邏輯是,第一等的學習成績還是必殺的。又一次湧起學演算法的衝動。大量的現有開源專案閱讀 學習 二次開發,專案的設計思...
我已經不想寫演算法了
終於可以在辦公室寫程式了 但是回來卻比以前累了 又到一年招聘時,部落格上好多 面經 宛如昨日。缺少大型專案經驗,缺乏 實踐,課程學習不紮實,不熟練,都可能導致在面試中被刷掉。當然,這裡的邏輯是,第一等的學習成績還是必殺的。又一次湧起學演算法的衝動。大量的現有開源專案閱讀 學習 二次開發,專案的設計思...