ZZSZOI 2022 模拟赛 Round 2 题目及题解

本文介绍了ZZSZOI 2022模拟赛第二轮的四道算法题,包括越狱问题、花神游历各国、叶子的染色和树的统计。涉及的算法包括动态规划、线段树、树状数组、并查集和树形DP。每道题都详细解释了思路,并提供了部分代码实现。
摘要由CSDN通过智能技术生成

说在正文前: ZZSZOI是由ZZSZ举办的,旨在让ZZSZ机房中的人受苦提高代码水平的模拟赛,赛制为OI赛制,共四道题,难度与CSP-S相当。

1.越狱(prison) P3197 [HNOI2008]越狱

算法:数学,容斥原理

由题得,发生越狱的条件为:有相同宗教信仰的人住在相邻房间。反之,只要相邻房间之间的人宗教信仰不同就可以保证无人越狱。记事件A:有相同宗教信仰的人住在相邻房间;事件B:相邻房间之间的人宗教信仰不同。则我们可以称事件A与事件B互为对立事件,根据容斥原理,我们可以得到

P(A)=1-P(B)

接下来我们只要求出相对简单的事件B的方案数,再用方案总数减去事件B的方案数即为事件A的方案数,则我们可以得到以下公式:

事件A方案数=总方案数-事件B方案数=m^{n}-m*(m-1)^{n-1}=m*(m^{n-1}-(m-1)^{n-1}) 

我们只需要求出这个公式的值便为最终答案。

代码实现: 

法一:利用乘方的余数的周期性

#include<bits/stdc++.h>
using namespace std;
const int P=100003;
const int N=1e6+10;
int vis1[P+10],vis2[P+10];
int s1[N],s2[N];
long long n,m;
int main()
{
//	freopen("prison.in","r",stdin);
//	freopen("prison.out","w",stdout);
	scanf("%lld%lld",&m,&n);
	long long ans1=1;
	long long ans2=1;
	long long cnt1=0,cnt2=0;
	while(cnt1<n)
	{
		ans1=ans1*(m%P);
		ans1%=P;
		if(vis1[ans1]) break;
		s1[++cnt1]=ans1;
		vis1[ans1]=1;
	}
	while(cnt2<n)
	{
		ans2=ans2*((m-1)%P);
		ans2%=P;
		if(vis2[ans2]) break;
		s2[++cnt2]=ans2;
		vis2[ans2]=1;
	}
	s1[0]=s1[cnt1];
	s2[0]=s2[cnt2];
	long long ys1=(n-1)%cnt1;
	long long ys2=(n-1)%cnt2;
	long long ans=(s1[ys1]-s2[ys2]+P)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值