日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【excrt】屠龙勇士(luogu 4774)

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【excrt】屠龙勇士(luogu 4774) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

luogu 4774


題目大意

有n條龍,第i條血量為aia_iai?,回血量為bib_ibi?,殺死后掉落傷害為DiD_iDi?的刀,初始有若干刀

殺第i條龍要用現有傷害比aia_iai?小的刀中傷害最大的(如果沒有就用傷害最小的),對第i條龍造成x次傷害后,龍會連續回血,每次回bib_ibi?,若某一時刻龍的血量為0,那么該龍死亡

現在問你找到最小的x,使其滿足能殺死所有龍


解題思路

對于每條龍所選刀,可以用multiset存現有刀,然后直接查詢符合的

設所選刀傷害為did_idi?,那么答案就是要求:

?(ai?di×x)≡0(modbi)-(a_i-d_i\times x)\equiv 0(\mod b_i)?(ai??di?×x)0(modbi?)

di×x≡ai(modbi)d_i\times x\equiv a_i(\mod b_i)di?×xai?(modbi?)

該式子形如crt的式子

因為bib_ibi?不保證互質,所以求解要用excrt


代碼

#include<set> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll __int128 #define N 100100 using namespace std; ll T, n, m, p, x, y, g, X, mx, a[N], mo[N], b[N]; multiset<ll>d; ll exgcd(ll a,ll b, ll &x, ll &y) {if(!b){x = 1;y = 0;return a;}ll k = exgcd(b, a % b, x, y);ll z = y;y = x - a / b * y;x = z;return k; } ll read() {char ch=getchar();ll ds=0,fs=1;while (ch<'0'||ch>'9') {if (ch=='-') fs=-1;ch=getchar();}while (ch>='0'&&ch<='9') ds=(ds<<3)+(ds<<1)+ch-48,ch=getchar();return ds*fs; } void writ(ll c) {if (c/10) writ(c/10); putchar(c%10+48); return;} void write(ll s) {s<0?putchar(45),writ(-s):writ(s); putchar(10);return;} int main() {T = read();while(T--){mx = 0;p = 0;d.clear();n = read();m = read();for (ll i = 1; i <= n; ++i)a[i] = read();for (ll i = 1; i <= n; ++i)mo[i] = read();for (ll i = 1; i <= n; ++i)b[i] = read();for (ll i = 1; i <= m; ++i)d.insert(read());for (ll i = 1; i <= n; ++i)//找刀{multiset<ll>::iterator it = d.upper_bound(a[i]);if (it == d.begin()) x = *it;else x = *--it;d.erase(it);d.insert(b[i]);b[i] = x;mx = max(mx, (a[i] - 1) / b[i] + 1);//最小刀數}m = 1;X = 0;for (ll i = 1; i <= n; ++i)//excrt{g = exgcd(b[i] * m, mo[i], x, y);if ((a[i] - X * b[i]) % g){p = 1;break;}x = x * ((a[i] - X * b[i]) / g) % (mo[i] / g);X = X + x * m;m = m * (mo[i] / g);X = (X % m + m) % m;//最小解}if (p){puts("-1");continue;}if (X < mx) X += (mx - X + m - 1) / m * m;//保證剩余血量>0write(X);}return 0; }

總結

以上是生活随笔為你收集整理的【excrt】屠龙勇士(luogu 4774)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。