【2025.8.11】模拟赛

T1

solution

先特判买不够 \(a\) 瓶和能买无限瓶的两种情况。

接着一直买 \(a\) 瓶,直到买不够为止。

(签到题竟然挂了)

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t;
ll n,x,a,b;
ll ans=0;
int main(){
	freopen("buy.in","r",stdin);
	freopen("buy.out","w",stdout);
	cin>>t;
	while(t--){
		scanf("%lld%lld%lld%lld",&n,&x,&a,&b);
		ans=0;
		if(n/x<a){
			printf("%lld\n",n/x);
			continue;
		}
		if(a*x<=b){//7 2 3 5
			printf("-1\n");
			continue;
		}
		ll tmp=(n-a*x)/(a*x-b);
		ans=tmp*a;
		n-=tmp*(a*x-b);
		while(n>=a*x){
			n-=a*x-b;
			ans+=a;
		}
		ans+=n/x;
		printf("%lld\n",ans);
	}
	fclose(stdin);fclose(stdout);
	return 0;
}

T2

solution

每次找相邻的三个颜色不同的点进行划分,找到后把中间的点删去,用链表维护。

特别地,如果存在只剩一个的颜色,就拿这个点往其他所有没被删去的点连对角线。

code

#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
struct node{
	int x,y;
}ans[N];
int n,tot=0;
char s[N];
int a[N];
int lst[N],nxt[N];
bool vis[N];
int cnt[5];
queue<int> q;
int ch(char c){
	if(c=='R')  return 0;
	if(c=='G')  return 1;
	if(c=='B')  return 2;
}
bool check(int idx){
	if(a[lst[idx]]==a[idx])  return 0;
	if(a[nxt[idx]]==a[idx])  return 0;
	if(a[lst[idx]]==a[nxt[idx]])  return 0;
	return 1;
}
int main(){
	freopen("polygon.in","r",stdin);
	freopen("polygon.out","w",stdout);
	cin>>n;
	cin>>s+1;
	for(int i=1;i<=n;++i){
		a[i]=ch(s[i]);
		cnt[a[i]]++;
		lst[i]=(i!=1?i-1:n);
		nxt[i]=(i!=n?i+1:1);
	}
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;++i)
	  if(check(i))
	    q.push(i);
	while(1){
		if(cnt[0]==1||cnt[1]==1||cnt[2]==1){
			int pos=0;
			for(int i=1;i<=n;++i)
			  if(!vis[i]&&cnt[a[i]]==1)
			    pos=i;
			for(int i=1;i<=n;++i)
			  if(!vis[i]&&i!=pos&&i!=lst[pos]&&i!=nxt[pos]){
			  	ans[++tot].x=i;
			  	ans[tot].y=pos;
			  }
			break;
		}
		int u=q.front();
		q.pop();
		if(vis[u])  continue;
		if(check(u)){
			ans[++tot].x=lst[u];
			ans[tot].y=nxt[u];
			lst[nxt[u]]=lst[u];
			nxt[lst[u]]=nxt[u];
			vis[u]=1;
			cnt[a[u]]--;
			if(check(lst[u]))  q.push(lst[u]);
			if(check(nxt[u]))  q.push(nxt[u]);
		}
	}
	for(int i=1;i<=tot;++i)
	  printf("%d %d\n",ans[i].x,ans[i].y);
	fclose(stdin);fclose(stdout);
	return 0;
}

T3

solution

\(kx + b\equiv ax\equiv U \pmod p\),分别用扩欧和扩展欧拉定理做,再用扩展中国剩余定理合并起来。

故最终算法为不停递归,每次 \(p\to \gcd(p,\varphi(p))\),当 \(p = 1\) 时,\(x = 1\) 总是合法解;然后倒推出最初要求的解。

\(\gcd⁡(a,p)\ne 1\) 时, 我们需要给 \(x\) 一个下界,因为拓展欧拉定理要求 \(x\ge \varphi(p)\)。只需要在解同余方程时强制要求解 \(\ge 10^9\) 即可。

时间复杂度 \(O(T\sqrt{p})\)

T4

solution

启发式合并+并查集维护。

posted @ 2025-08-11 21:08  TimeSpacerui  阅读(7)  评论(0)    收藏  举报