求助代码哪里炸long long了/kel
查看原帖
求助代码哪里炸long long了/kel
234074
樱雪喵>w<楼主2022/8/4 00:09

RT,看讨论区 WA 后三个点都是没写龟速乘/没开 long long 的问题,但是窝实在没看出来自己哪里炸掉了,求各位大佬帮忙/wq

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int T,n,m,b[N],a[N],t[N],p[N];
multiset<int> q;
int x,y,maxn;
int mul(int n,int k,int p)
{
	int ans=0;
	while(k)
	{
		if(k&1) ans=(ans+n)%p;
		n=(n+n)%p;k>>=1;
	}
	return ans;
}
void exgcd(int a,int b,int &gd)
{
	if(!b) 
	{
		x=1;y=0;gd=a;
		return;
	}
	exgcd(b,a%b,gd);
	int x0=x,y0=y;
	x=y0;y=x0-(a/b)*y0;
}
int excrt()
{
	int lcm=1,ans=0;
	int A,B,C,gd;
	for(int i=1;i<=n;i++)
	{
		A=mul(b[i],lcm,p[i]);B=p[i];
		C=((a[i]-mul(b[i],ans,p[i]))%p[i]+p[i])%p[i];
		exgcd(A,B,gd);x=(x%B+B)%B;
		if(C%__gcd(A,B)) return -1;
		ans=(ans+mul(mul(C/gd,x,B/gd),lcm,lcm*B/gd));
		lcm*=B/gd;ans%=lcm;
	}
	if(ans<maxn) ans+=((maxn-ans-1)/lcm+1)*lcm;
	return ans;
}
signed main()
{
	scanf("%lld",&T);
	while(T--)
	{
		maxn=0;q.clear();
		scanf("%lld%lld",&n,&m);
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
		for(int i=1;i<=n;i++) scanf("%lld",&p[i]);
		for(int i=1;i<=n;i++) scanf("%lld",&t[i]);
		for(int i=1;i<=m;i++)
		{
			int qwq;
			scanf("%lld",&qwq);
			q.insert(qwq);
		}
		for(int i=1;i<=n;i++)
		{
			auto u=q.upper_bound(a[i]);
			if(u!=q.begin()) u--;
			b[i]=*u;q.erase(u);q.insert(t[i]);
			maxn=max(maxn,1+(a[i]-1)/b[i]);
		}
		cout<<excrt()<<endl;
	}
	return 0;
}
2022/8/4 00:09
加载中...