墨墨突然對等式很感興趣,他正在研究 a1x
1+a2
x2+.
..+a
nxn=
ba1
x1+
a2x
2+.
..+a
nxn
=b 存在非負整數解的條件,他要求你編寫乙個程式,給定nn、a
nan、以及b
b的取值範圍,求出有多少b
b可以使等式存在非負整數解。
以下內容大部分摘自這篇題解。b≤
106b
≤106
的部分分就是乙個裸的揹包。但是這道題的範圍是b≤1
012b≤
1012
。若滿足a1x
1+a2
x2+.
..+a
nxn=
pa1
x1+
a2x
2+.
..+a
nxn
=p,那麼一定滿足a1x
1+a2
x2+.
..+a
nxn=
p+k×
minn
a1x
1+a
2x2
+..
.+an
xn
=p+k
×min
n。顯然在p
p越小時,k
k能取到的值越大。設mi
nn=m
inmi
nn=m
in,di
s[i]
dis[
i]表示bmod
minn
=ibm
odmi
nn=i
時pp的最小值。
對於每乙個數字aia
i,建邊j→(
j+ai
)mod
minn
j→(j
+ai
)mod
minn
,其中j∈[
0,mi
nn)j
∈[0,
minn
)。然後從0開始跑最短路,這樣就可以求出dis
dis了。
那麼b∈[0
,k]b
∈[0,
k]時原式有非負整數解的數量即為∑i=
0min
n−1(
k−di
s[i]
minn
+1)∑
i=0m
inn−
1(m
innk
−dis
[i]+1)
#include
#include
#include
#include
#define mp make_pair
using
namespace std;
typedef
long
long ll;
const
int n=
15,m=
500010
;int n,tot,minn,a[n]
,head[m]
;ll bmin,bmax,dis[m]
;bool vis[m]
;struct edge
e[n*m]
;void
add(
int from,
int to,
int dis)
void
dij()}
}}ll count
(ll k)
intmain()
for(
int i=
0;i)for
(int j=
1;j<=n;j++
)add
(i,(i+a[j]
)%minn,a[j]);
dij();
printf
("%lld"
,count
(bmax)
-count
(bmin-1)
);return0;
}
最短路構造 P2371 國家集訓隊 墨墨的等式
更加感性的理解就是求乙個dis i 表示由n個 a i 求和 modt 為 i 的最小值 這樣就可以先跑一遍最短路,算出dis,然後從0到t 1走一遍,算出在bmin bmax有多少數就行了 includeusing namespace std define pli pairconst int ma...
P2371 國家集訓隊 墨墨的等式 同餘最短路
傳送門 題意 思路 乙個同於最短路的板子題,初始的時候值為0,所以設dis 0 0dis 0 0 dis 0 0,讓後選擇乙個最小的a i a i a i 作為b as ebase base 跑一遍同餘最短路就好啦。跑完dis i dis i dis i 表示在模bas ebase base 的意義...
P2371 國家集訓隊 墨墨的等式(同餘最短路)
題目大意 給定 n nn 個整數 a ia i ai 和 l,r l,rl,r 求 i 1nai xi n n l,r sum na ix i n n in l,r i 1n ai x i n n l,r 有多少組非負整數解 題目分析 同樣是同餘最短路的模型,還是套路的取 a 1a 1 a1 作為 ...