染色问题
描述 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.
这是一道关于染色问题的数学题目,描述了在一串未打结的项链上,如何用M种颜色为N颗珠子染色,使得相邻的珠子颜色不同。该问题启发自HEOI2012的赵州桥题目,要求求解染色方法总数模P的结果。题目给出了数据范围和测试用例,并提示解题时不应考虑过于复杂的Polya理论,以适应简单的理解能力。
(快速加,快速乘,快速幂)&spm=1001.2101.3001.5002&articleId=53023318&d=1&t=3&u=62d2c5aea27b4e2b99f011a95662463b)
1389

被折叠的 条评论
为什么被折叠?



