题目
监狱有连续编号为
1...N
的
N
个房间,每个房间关押一个犯人,有
1≤M≤108
1≤N≤1012
分析
发生越狱的情况数=总的情况数-不发生越狱的情况数。
总的情况数=
MN
,不发生越狱情况数=
M×(M−1)N−1
所以
Ans=MN−M×(M−1)N−1
,两次快速幂计算。
代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef long long LL;
const int L=100003;
LL n,m;
LL mi(LL w,LL i)
{
if (i==0) return 1;
LL res=mi(w,i/2);
(res*=res)%=L;
if (i%2==1) (res*=w)%=L;
return res;
}
int main(void)
{
scanf("%lld%lld",&m,&n);
printf("%lld\n",((mi(m,n)-(m*mi(m-1,n-1))%L)%L+L)%L);
return 0;
}
小结
计数问题最基本的转化就是用全集-补集。
对于取模,注意两点:
①最后的输出为正数,要加上
ans=(ans+M)modM
转为正数;
②运算中间小心超出int的情况,要强制转换成Lint运算,注意强制转化的部分的内部不要超出int。