说在正文前: ZZSZOI是由ZZSZ举办的,旨在让ZZSZ机房中的人受苦提高代码水平的模拟赛,赛制为OI赛制,共四道题,难度与CSP-S相当。
1.越狱(prison) P3197 [HNOI2008]越狱
算法:数学,容斥原理
由题得,发生越狱的条件为:有相同宗教信仰的人住在相邻房间。反之,只要相邻房间之间的人宗教信仰不同就可以保证无人越狱。记事件A:有相同宗教信仰的人住在相邻房间;事件B:相邻房间之间的人宗教信仰不同。则我们可以称事件A与事件B互为对立事件,根据容斥原理,我们可以得到
接下来我们只要求出相对简单的事件B的方案数,再用方案总数减去事件B的方案数即为事件A的方案数,则我们可以得到以下公式:
事件A方案数=总方案数-事件B方案数=
=
![]()
我们只需要求出这个公式的值便为最终答案。
代码实现:
法一:利用乘方的余数的周期性
#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)