BZOJ1008: [HNOI2008]越狱
【传送门:BZOJ1008】
简要题意:
有n个格子,每个格子里有且只有一个球,有m种颜色,每个球都有颜色,求出有相邻的格子的两个球为相同颜色的情况数
题解:
就是一个组合数学,很容易就能想到把随便放的所有情况减去所有相邻格子都不同的情况就是答案了,那么怎么求呢?
先求出n个格子随便放m种颜色球的情况数就是m^n(n个m相乘,因为可以很多球是相同颜色的)
接下来就是要求所有相邻格子都不同的情况
第一个格子假如放了1号颜色的球,那么第二个格子就会有m-1种选择,到第二个格子的时候,第三个格子就只有m-2种选择?错!!还是有m-1种选择,因为我们只是要求相邻的格子的球颜色不相同,所以第三个格子只需要选择与第二个格子不相同的颜色的球就可以了
以此类推,因为第一个格子无论选什么对后面都没影响,所以所有相邻格子都不同的情况数就是(m-1)^(n-1)
答案就是m^n-(m-1)^(n-1)
但是还没有完,因为常数n,m很大,而且答案要mod100003,所以我们用快速幂来处理答案
参考代码:
#include<cstdio> #include<cstring> using namespace std; typedef long long LL; LL q_mod(LL a,LL b) { LL ans=1;a=a%LL(100003); while(b) { if(b&1) ans=(ans*a)%LL(100003); b>>=1;a=a*a%LL(100003); } return ans; } int main() { LL n,m; scanf("%lld%lld",&m,&n); LL s=(q_mod(m,n)%LL(100003)-m*q_mod(m-1,n-1)%LL(100003)+LL(100003))%LL(100003); printf("%lld",s); return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚