问题 D: 【快速幂】越狱

题目描述
监狱有连续编号为1…N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱

输入
输入两个整数M,N.1<=M<=108,1<=N<=1012

输出
可能越狱的状态数,模100003取余

样例输入
复制样例数据
2 3
样例输出
6

提示
6种状态为(000)(001)(011)(100)(110)(111)

思路:用M的N次方-M*(M-1)^(N-1),如果结果小于0,则加上100003

#include 
#define MOD 100003
long long ksm(long long a,long long b)
{
	long long ans = 1;
	while(b){
		if(b&1) ans = (ans*a)%MOD;
		b >>= 1;
		a = (a*a)%MOD;
	}
	return ans%MOD;
}

int main()
{
	long long M,N;
	scanf("%lld %lld",&M,&N);
	long long ans1 = ksm(M,N)%MOD;
	long long ans2 = (M*ksm(M-1,N-1))%MOD;
	long long ans = ans1-ans2;
	if(ans < 0){
		ans += MOD;
	}
	printf("%lld\n",ans);
	return 0;
}

你可能感兴趣的:(UPC)