洛谷P2371 墨墨的等式 最短路

2022-09-01 09:27:11 字數 2160 閱讀 8021

墨墨突然對等式很感興趣,他正在研究 a1x

1+a2

x2+.

..+a

nxn=

ba1​

x1​+

a2​x

2​+.

..+a

n​xn

​=b 存在非負整數解的條件,他要求你編寫乙個程式,給定nn、a

nan、以及b

b的取值範圍,求出有多少b

b可以使等式存在非負整數解。

以下內容大部分摘自這篇題解。b≤

106b

≤106

的部分分就是乙個裸的揹包。但是這道題的範圍是b≤1

012b≤

1012

。若滿足a1x

1+a2

x2+.

..+a

nxn=

pa1​

x1​+

a2​x

2​+.

..+a

n​xn

​=p,那麼一定滿足a1x

1+a2

x2+.

..+a

nxn=

p+k×

minn

a1​x

1​+a

2​x2

​+..

.+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 作為 ...