UOJ七月月赛B #262. 宿舍惨案

题目背景:

ZYHW是个神奇的学校,而这个学校的神奇之处就在于它的宿舍...

题目描述:

(为了节省时间,压缩了题面)

宿舍有连续编号为1...N的N个房间,每个房间安排一个同学,有M个班级,每个同学可能是其中一个班级的学生。

如果相邻房间的同学是班级相同的同班同学,就可能发生一些违规行为(这里就不举例了qwq),求有多少种状态可能发生违规行为?

数据输入:

输入两个整数M,N.

数据输出:

可能违规行为的状态数,模100003取余

输入样例:

2 3

输出样例:

6

数据范围:

对于10%的数据M<=20,N<=20

对于100%的数据1<=M<=10^8,1<=N<=10^12

空间限制:128MB 时间限制:1s

样例提示:

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

 

题解

一共有m^n种方案

有m*((m-1)^(n-1))种方案不符

所以答案为m^n-m*((m-1)^(n-1))

#include 
#include 
#include 
using namespace std;
long long f(long long a,long long k,long long m)
{
long long b=1;
while(k>=1)
{
if(k%2==1) b=a*b%m;
a=a*a%m;
k=k/2;
}
return b;
}
int main(){
	long long n,m;
	cin>>m>>n;
	long long cnt=0;
	long long a=0,x=0;
	a=f(m-1,n-1,100003);
	x=f(m,n,100003);
	a=(a*m)%100003;
	if(x-a>0)
	cout<<(x-a);
	else
	cout<<(x-a)+100003;
} 

 

你可能感兴趣的:(C++,数论)