您的位置:首页 > 其它

【bzoj1008】[HNOI2008]越狱

2016-03-25 17:44 204 查看
这是一道数学题。属于排列组合问题。

题目抽象一下就是有n个格子,用m种颜色染色,求有两个相邻的同色的情况有多少种。

其实反过来考虑更好算。

总的方案数为mn,减去每个相邻的都不同色的情况既可。

考虑每个相邻的都不同色,第一个格子可以用m中,后面的每一个格子都只能用m-1中,所以就是m(m-1)n-1,最后的答案就是mn-m(m-1)n-1。

需要用到快速幂加同余。

注意减出来可能有负数,加上mod即可。

速度极快。

#include<algorithm>

#include<iostream>

#include<cstdlib>

#include<cstring>

#include<cstdio>

#include<cmath>

using
namespace
std;


typedef
long
long
LL;


#define MOD 100003


LL m,n;


int
qpow(LL a,LL b,LL c)

{


LL ans=1;

LL k=a%c;

while
(b)

{

if
(b&1)

ans=1LL*ans*k%c;

b>>=1;

k=1LL*k*k%c;

}

return
ans;

}


int
main()

{

scanf
(
"%lld%lld"
,&m,&n);

LL ans=qpow(m,n,MOD);

ans=(ans+MOD-m*qpow(m-1,n-1,MOD)%MOD)%MOD;

printf
(
"%lld"
,ans);

return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: