P2371 國家集訓隊 墨墨的等式(同餘最短路)

2021-10-22 07:29:04 字數 1884 閱讀 8205

題目大意:

給定 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​ 作為 bas

ebase

base

,然後建出 0

00 到 a1−

1a_1-1

a1​−

1 這 a

1a_1

a1​ 個點,然後對每個點連出 n−1

n-1n−

1 條邊:連線 i

ii 與 (i+

val)

moda

1(i+val)\mod a_1

(i+val

)mod

a1​ 邊權為 val

valva

l ,然後因為是求 [l,

r]

[l,r]

[l,r

] 範圍的解數量,不難想到轉換為求出 [1,

r]

[1,r]

[1,r

] 的解的數量再減去 [1,

l−1]

[1,l-1]

[1,l−1

] 的解的數量

具體細節見**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x3f3f3f3f

#define inf 0x3f3f3f3f3f3f3f3f

#define int ll

using

namespace std;

intread()

while

(ch>=

'0'&& ch<=

'9')

return res*flag;

}const

int maxn =

5e5+5;

const

int maxm =

5005

;const

int mod =

998244353

;const

double pi =

acos(-

1);const

double eps =

1e-8

;struct edgeedge[maxn*13]

;int n,m,l,r,a[maxn]

,cnt,head[maxn]

,dis[maxn]

;bool vis[maxn]

;void

addedge

(int from,

int to,

int val)

struct node};

void

dijkstra

(int s));

while

(!qu.

empty()

));}

}}}int

solve

(int x)

signed

main()

P2371 國家集訓隊 墨墨的等式

p2371 國家集訓隊 墨墨的等式 同餘最短路,考慮直接用最小的代價拼出來在膜最小 a i 意義下的餘數。然後不停地累加最小的 a i 一下稱它 a 就行了。正確性 假定 i,j,k 為膜 a 下的餘數,令 i j equiv k mod a 那麼顯然 i j t cdot a k t 為任意非負整...

最短路構造 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 的意義...