(題目鏈結)
給出$$的取值範圍$$,求方程$*x_+a_*b_+~~+a_*b_=b}$有多少$$可以使等式存在非負整數解。
問題很容易就被轉化為:用$,a_,a_,······a_}$能組成多少個在範圍$$內的數。這是一類經典的圖論問題。
我們假設$$中最小的元素為$$,可以考慮用$$個數能夠組成的數對$$的模的情況。用$$表示構成的乙個數$$,且$$,$$是滿足上述兩個條件的最小值。我們在這裡將題目中的區間改為具體的詢問,更好的進行討論,對於詢問$$,設$$,則有以下三種情況:
$$。由於用這$$個數構成的乙個模$$為$$的數,這個數的最小值為$$,而$$,說明$$是無法構成的。
$$。由於用這$$個數構成的乙個模$$為$$的數,這個數的最小值為$$,而$$,說明$$可以構成,且是能構成的模$$等於$$的最小的數。
$$時,$$是可以被構成的,否則則不能。
現在的問題是如何求解$$陣列?
相信各位看官已經發現$$陣列的命名有點詭異,沒錯就是用最短路求解。由於$$,$$的範圍在$$內,因此可以建立$$個點$$。對於點$$和任意乙個數$$,設$$,可以認為從$$到$$連條邊權為$$的邊,表示可以從$$這個點,通過加上邊權$$,到達$$的點。由於$$,即可設$$為數字編號為0的點。要求$$是否能由$$個數構成,就要求出$$的最小值了;當$$大於等於$$,它就能夠由著$$個數構成,設$$,$$即為$$這個點到達$$點的最短距離,它可以由0點直接加邊權$$得到,也可以經過其他中間點到達。轉換後,它就是個最短路問題了。
再回到這個問題上。於是我們先建圖,跑一遍最短路,預處理出$$陣列,然後列舉$$~$$,計算模$$為$$的數在區間$$中有多少個,統計答案即可。
堆裡面又忘記開long long了,尷尬。
// bzoj2118#include#include#include#include#include#include#include#define ll long long
#define mod 10007
#define inf (1ll<<60)
#define pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
const int maxn=500010;
struct edge e[maxn*10];
struct data
};int head[maxn],a[maxn],vis[maxn];
int n,cnt;
ll l,dis[maxn],r;
void link(int u,int v,int w)
void dijkstra() }}
int main()
printf("%lld\n",ans);
return 0;
}
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...