NOI2018 D2T1 求助 30pts
  • 板块灌水区
  • 楼主OrientDragon
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/7 16:32
  • 上次更新2024/12/7 19:10:13
查看原帖
NOI2018 D2T1 求助 30pts
1173109
OrientDragon楼主2024/12/7 16:32
#include <bits/stdc++.h>
#define __int128 long long
#define SI static inline
#define getchar() (p1==p2&&(p2=(p1=buffer)+fread(buffer,1,1<<21,stdin),p1==p2)?EOF:*p1++)
using namespace std;
char buffer[1<<21],*p1,*p2;
SI int read(){int x=0;bool f=1;char ch=getchar();while(ch<48||ch>57){if(ch==45)f=0;ch=getchar();}while(ch>=48&&ch<=57){x=x*10+(ch^48);ch=getchar();}return f?x:-x;}
SI void write(int x){if(x<0){putchar(45);write(-x);return;}if(x>9)write(x/10);putchar(x%10^48);}
SI void writeln(int x){write(x),puts("");}
SI int gcd(int a,int b){return !b?a:gcd(b,a%b);}
SI int exgcd(int a,int b,int&x,int&y){if(!b){x=1,y=0;return a;}int tmp=exgcd(b,a%b,y,x);y-=a/b*x;return tmp;}
SI int qp(int a,int b,int p=1e9+7){int ret=1;for(;b;b>>=1,(a*=a)%=p)if(b&1)(ret*=a)%=p;return ret;}
#define lowbit(x) x&-x
SI void solve();
#define MULT
signed main(){int T=1;
#ifdef MULT
T=read();
#endif
while(T--)solve();}
/*----free--*/
const int N=100005;
int n,m,mx,a[N],b[N],p[N],reward[N];
multiset<int>s;
SI int exCRT(){
	// b[i]*x = a[i] (mod p[i])
	int A,B,C,M=1;
	int ans=0; // 前 i-1 条的解 
	for(int i=1;i<=n;i++){
		// 现在考虑将前 i-1 条和第 i 条合并
		// b[i]*(ans+Mx) = a[i] (mod p[i])
		// (b[i]M)x + (p[i])y = (a[i]-b[i]*ans)
		A=b[i]*M%p[i];
		B=p[i];
		C=(a[i]-b[i]*ans%p[i]+p[i])%p[i];
		// ax+by=(a,b)
		int x,y;
		int gd=exgcd(A,B,x,y);
		if(C%gd)return -1;
		x=(x%B+B)%B;
		// ax+by=c : x=(x*(C/gcd))
		// ans <- ans+Mx : ans+=M*(x*(C/gcd))
		ans+=(C/gd)*x%(B/gd)*M%(M*=B/gd);
		ans%=M;
	}
	if(ans<mx)ans+=((mx-ans-1)/M+1)*M;
	return ans;
}
/*--unfree--*/
SI void solve(){
	s.clear();
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=n;i++)p[i]=read();
	for(int i=1;i<=n;i++)reward[i]=read();
	for(int i=1;i<=m;i++)s.insert(read());
	mx=0;
	for(int i=1;i<=n;i++){
		auto u=s.upper_bound(a[i]);
		if(u!=s.begin())u--;
		b[i]=*u;
		s.erase(u);
		s.insert(reward[i]);
		mx=max(mx,(a[i]-1)/b[i]+1);
	}
	writeln(exCRT());
}

原题:P4774

和第一篇题解对比了,没有发现哪里写挂了

int <- __int128

2024/12/7 16:32
加载中...