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 <iostream>
#include <stdio.h>
#include <cstring>
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;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章