傳送門
好神啊。。
需要用非負數個a1,a2,a3...an來湊出b
可以知道,如果乙個數x能被湊出來,那麼x+a1,x+a2.......x+an也都能被湊出來
那麼我們只需要選擇a1~an中任意乙個的a,可以求出在%a下的每個數最小需要多少才能湊出來
這樣我們選擇乙個最小的a,速度更快,令m=min(a[k]) 1 <= k <= n
然後建模,i向(i+a[j])%m連一條權值為a[j]的邊
跑一邊最短路就可以了
然後需要求bmin~bmax中的解
只需要ans(bmax)-ans(bmin)即可
注意a[i]==0的點。。。。
#include #include #include #include #define n 6000001#define ll long long
using namespace std;
int n, cnt;
int head[n], to[n], next[n];
ll l, r, ans, dis[n], m = ~(1 << 31), a[21], val[n];
bool vis[n];
queue q;
inline ll read()
inline void add(int x, int y, ll z)
inline void spfa()
}} }
}inline ll query(ll x)
int main()
m = min(m, a[i]);
} for(i = 0; i < m; i++)
for(j = 1; j <= n; j++)
add(i, (i + a[j]) % m, a[j]);
spfa();
printf("%lld\n", query(r) - query(l - 1));
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...