**排列组合——越狱(快速幂)**
监狱有连续编号为 111 到 nnn 的 nnn 个房间,每个房间关押一个犯人。有 mmm 种宗教,每个犯人可能信仰其中一种。
如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。求有多少种状态可能发生越狱。
输入格式
输入两个整数 mmm 和 nnn。
输出格式
可能越狱的状态数,对 100003100003100003 取余。
所有可能的 666 种状态为:{0,0,0},{0,0,1},{0,1,1},{1,0,0},{1,1,0},{1,1,1}{0,0,0},{0,0,1},{0,1,1},{1,0,0},{1,1,0},{1,1,1}{0,0,0},{0,0,1},{0,1,1},{1,0,0},{1,1,0},{1,1,1}。
数据范围与提示
对于全部数据,1≤m≤108,1≤n≤10121\le m\le 10^8,1\le n\le 10^{12}1≤m≤108,1≤n≤1012。:
解题思路:
运用排列组合,所有种类数减去不成立的种类数即为成立的种类数
#include <stdio.h>
#include <stdlib.h>
long long fun(long long a,long long b);
int main()
{
long long m ,n;
scanf("%lld %lld",&m,&n);
printf("%lld",(fun(m,n)+100003-m*fun(m-1,n-1)%100003)%100003);
return 0;
}
long long fun(long long a,long long b)//快速幂函数;
{
long long sum=1;
while(b)
{
if(b&1)sum=(sum*a)%100003;
a=a*a%100003;
b=b>>1;
}
return sum;
}