染色問題 (數學)(快速加,快速乘,快速冪)

染色問題
描述 Description
做了HEOI2012的趙州橋(bridge)之後,liouzhou_101就感到極其的不爽,首先那題題目敘述巨渣,然後做法極坑。
不過那題是一道和染色有關的問題,於是在此同時也啓發liouzhou_101想到了這樣一個簡單的問題:
在一串未打結的項鍊上(意思就是說項鍊的左端和右端不相連),有N顆珠子,你有M種顏色,然後就問你有多少種方法將每一顆珠子都染上顏色,使得任意兩顆相鄰的珠子的顏色不同。
liouzhou_101這種傻×自然不會做了,於是來向你請教…
當然,由於liouzhou_101的腦子構造極其簡單,你不要想太多,請不要考慮Polya之類的本質相同,否則的話僅憑liouzhou_101的理解能力是不能理解的…

輸入格式 InputFormat
輸入只有一行,三個正整數N、M和P,之間以一個空格隔開。
輸出格式 OutputFormat
輸出只有一行,表示染色的方法總數模P。
樣例輸入
5 4 13

樣例輸出
12

數據範圍和註釋 Hint
一共有324種染色方法,對13取模後是12。

對於10%的數據,N=1,M<=10,P<=10;
對於20%的數據,N<=10,M<=10,P<=100;
對於50%的數據,N,M,P<=1,000,000,000;
對於100%的數據,1<=N,M,P<=1,000,000,000,000,000,000,且M>=2。

program mys;

var n,m,p:int64;

function plus(x,y:int64):int64;
var ii,jj,kk,tt:int64;
begin
ii:=y; jj:=x;
kk:=0;
while ii>0 do
begin
if ii mod 2=1 then kk:=((kk mod p)+(jj mod p)) mod p;
ii:=ii div 2;
jj:=((jj mod p)+(jj mod p)) mod p;
end;
exit(kk mod p); 
end;    

procedure cheng(x,y:int64);
var ii,jj,kk:int64;
begin 
kk:=m;
ii:=y;
jj:=x;
while ii>0 do 
begin 
if ii and 1=1 then 
kk:=(plus(kk,jj))mod p;
ii:=ii div 2;
jj:=plus(jj,jj) mod p;
end;
writeln(kk mod p);
end;

begin 
assign(input,'color.in'); reset(input);
assign(output,'color.out'); rewrite(output);

readln(n,m,p);
cheng(m-1,n-1);
close(input);
close(output);
end.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章