萌新求助

P4774 [NOI2018] 屠龙勇士

```cpp #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) #define pre(i,a,b) for(int i=a;i>=b;i--) #define N 100005 #define int long long using namespace std; int n,m,a[N],p[N],k[N],b[N]; multiset<int>s; typedef multiset<int>::iterator it; int gcd(int x,int y){return y?gcd(y,x%y):x;} int lcm(int x,int y){return x/gcd(x,y)*y;} void exgcd(int A,int B,int &x,int &y){ if(!B){x=1;y=0;return;} int xx,yy; exgcd(B,A%B,xx,yy); x=yy;y=xx-(A/B)*yy; } int mul(int x,int y,int p){ int now=0; for(;y;y>>=1,x=(x<<1)%p)if(y&1)now=(now+x)%p; return now; } void solve(){ scanf("%lld%lld",&n,&m); rep(i,1,n)scanf("%lld",&a[i]); rep(i,1,n)scanf("%lld",&p[i]); rep(i,1,n)scanf("%lld",&k[i]); s.clear(); rep(i,1,m){ int x;scanf("%lld",&x); s.insert(x); } rep(i,1,n){ it now=s.upper_bound(a[i]); if(now!=s.begin())now--; b[i]=*now; s.erase(now);s.insert(k[i]); } int lm=1,xx=0; rep(i,1,n){ int g=gcd(b[i]*lm,p[i]); int c=a[i]-b[i]*xx; if(abs(c)%g!=0){puts("-1");return;} int x,y; exgcd(b[i]*lm,p[i],x,y); c/=g;x*=c;y*=c; x=(x%p[i]+p[i])%p[i]; g=lcm(p[i],lm); xx=(xx+mul(lm,x,g))%g;lm=g; } //cout<<xx<<" "<<lm<<endl; rep(i,1,n){ int mn=(a[i]-1)/b[i]+1; if(mn>xx){ int dta=mn-xx; xx+=((dta-1)/lm+1)*lm; } } printf("%lld\n",xx); } signed main(){ //freopen("dragon5.in","r",stdin); //freopen("dragon.out","w",stdout); int T;scanf("%lld",&T); while(T--)solve(); return 0; } ```
by 7KByte @ 2020-08-31 16:42:47


|