BZOJ2118 墨墨的等式

2022-08-19 22:51:13 字數 1928 閱讀 9547

description

傳送門大致就是給定等式\(a_x_ + a_x_ + a_x_ \dots + a_x_= b\), 現在給定\(\\),\(b\)的取值範圍\([b_, b_]\), 求b的取值範圍內有多少個b使\(\\)有非負整數解.

solution

先進行乙個簡單的轉化, 直接求\([0, l - 1]\),\([0,r]\) 的解然後減去.就只要考慮怎麼求\([0, a]\)的答案.

我們進行乙個簡單的轉化, 現在給定n個物品, 每個物品有無數個,求能表示出的價值的個數.

考慮乙個數z作為價值, 如果\(l\)能被z表示為\(l = kz + d\), 那麼\((l + z)\)也能被表示為\((k + 1)z + d\)

可以簡單的發現\(d \leq z\) 於是我們考慮答案按照模\(k\)的剩餘系分類, 然後最後計算剩餘系的總和.

設\(a_i\)為$a_i = min, qmodk = i $且能被構造.那麼答案就很好計算.

我們考慮\(k\)怎麼取值.顯然,k取\(min \\)最好, 因為它的剩餘系大小最小.

那麼對於任意乙個i和a[j], 我們用最短路求解, 從\(i\)向\((a_j + i) \% k\),連線一條長度為\(a_\)的邊.

然後跑一遍最短路即可

codes

#includeusing namespace std;

#define rep(i, a, b) for(int i = (a), i##_end_ = (b); i <= i##_end_; ++i)

#define drep(i, a, b) for(int i = (a), i##_end_ = (b); i >= i##_end_; --i)

#define clar(a, b) memset((a), (b), sizeof(a))

#define debug(...) fprintf(stderr, __va_args__)

#define debug(s) debug("the massage in line %d, function %s: %s\n", __line__, __function__, s)

typedef long long ll;

typedef long double ld;

const int buf_size = (int)1e6 + 10;

struct fastio

inline char getchar()

inline void putchar(char ch)

inline void flush()

}io;

ll read()

void write(ll x)

#define maxn 100

#define maxc 1000009

ll n, l, r, a[maxn];

struct edge g[maxc * 20];

int head[maxc], e;

ll min = llong_max;

void add(int u, int v, int w) , head[u] = e;

}namespace sssp

}; ll dis[maxc]; int vis[maxc];

priority_queue que;

void init_graph()

void dijkstra() ); dis[0] = 0;

while(!que.empty()) );}}

} }}ll solve(ll a)

int main()

啟發

對於一種求最小化\(a_i\)的值的問題,並且\(a_i\)可以由其他專案簡單的動態的求出.可以考慮最短路求解.這事實上提供了一種建模的好方法.

如果\(a_i\) 的取值範圍過於大, 可以考慮按模數分類後計算, 統計答案時求和

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