1008: [HNOI2008]越狱

 

Description

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

Input

  输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

Output

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

Sample Input

2 3

Sample Output

6

HINT

 

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

解题思路:

       能够越狱的状态数 = 总的状态数 - 不能越狱的状态数。

       即越狱的状态数=m^n - m*(m-1)^(n-1),再用快速幂计算就行了。

快速幂:

快速幂算法依赖于以下明显的公式:

   a^b%c,先把b化成二进制形式,然后所有非0的位置(k0,k1,……kw)。

快速幂代码:

int Powermod(int a,int b)
{
	int ans=1;
	a=a%c;
	while(b>0)
	{
		if(b%2==1)
			ans=(ans*a)%c;
		b=b/2;
		a=(a*a)%c;
	}
	return ans;
}

代码:

#include<stdio.h>
#define c 100003
long long n,m;
long long powermod(long long a,long long b)
{
	long long ans=1;
	a%=c;
	while(b>0)
	{
		if(b%2==1)
			ans=(ans*a)%c;
		b/=2;
		a=(a*a)%c;
	}
	return ans;
}
int main()
{
	long long a,b,ans;
	while(scanf("%lld%lld",&m,&n)!=EOF)
	{
		ans=0;
		a=powermod(m,n);
		b=m*powermod(m-1,n-1)%c;
		ans=a-b;
		if(ans<0)
			ans+=c;
		printf("%lld\n",ans);
	}
	return 0;
}