題目大意:
給定 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
aix
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 的意義...