數論 spfa演算法 bzoj 2118 墨墨的等式

2022-09-17 05:27:14 字數 2149 閱讀 6495

time limit: 10 sec  memory limit: 259 mb

submit: 1283  solved: 496

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

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

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

2 5 10

3 55

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

/*

一開始就沒想到是個最短路。

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

聯絡到最短路上面:

任選乙個ai>0,如果乙個價值k∗ai+x(0≤x*/

1

/*網上的ac**,我加了註解,注意把i64d改為lld

*/2 #include3 #include4 #include5 #include6 #include7

8#define md

9#define ll long long

10#define inf 1000000000000000ll

11#define eps 1e-8

12#define n 500010

13using

namespace

std;

14int

q[n];

15ll dis[n];

16bool

vis[n];

17int

mn,n;

18int a[20

];19

void

spfa()

2036}37

}38 vis[x]=0;39

}40}41

42ll query(ll x)

4349

50/*

windows 用i64d linux 用lld

*/51

intmain()

52 mn=min(mn,a[i]);}/*

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

*/57

for (int i=1;i/*

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

58spfa();

59 printf("

%i64d\n

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

));60

return0;

61 }

1/*2

首先,答案=ans(bmax)-ans(bmin-1)//利用差分

3找出a1到an中的最小值p,則如果可以構造出答案x,就可以構造出答案x+p

4所以我們只需要對於每個q(0<=qk) k』*p+q也能構造出來

5所以對於每個q建乙個點,對於每個ai,從q向(q+ai)%p連一條長度為ai的邊,先跑一遍最短路,計算出得到每個q的最小花費,如果最小花費大於了bmax,那麼沒有辦法湊出了。否則就計算可以湊出多少個。67

*/8#define n 15

9#define s 500010 //

注意題目時5*1e5

10 #include11

using

namespace

std;

12 #include13 #include14 typedef long

long

ll;15

ll l,r;

16bool vis[s]=;

17int n,mn=(1

<<31)-1

,a[n];

18ll dis[s];

19void

input()20

30 mn=min(mn,a[i]);31}

32}33void

spfa()

3455}56

}57}58

}59ll query(ll x)

6066

intmain()

67

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...