1. 程式人生 > >[HNOI2008]越獄(luogu P3197)

[HNOI2008]越獄(luogu P3197)

cst ron www ret can con col blog logs

原題鏈接:https://www.luogu.org/problem/show?pid=3197

題目大意:長度為n的數列中,每個元素的範圍為[0,m-1],求有多少種填法使至少有一組相鄰元素相等。

按照題意,並不好求,相鄰元素相等的情況太多,所以不妨用總的方案數減去任意相鄰元素不相等的方案數。

由乘法原理可知,總方案數為m^n種。

考慮任意相鄰元素不相等的情況,第一個元素有m種選法,後面的元素只需與前面一個元素不等即可,故之後的n-1個元素均有m-1種選法。

於是快速冪計算出m^n與(m-1)^(n-1)*m,他們的差即為最後結果。

#include<cstdio>
const long
long c=100003; long long ksm(long long a,long long b) { long long t=a%c,s=1; while(b) { if(b&1) s=(t*s)%c; t=(t*t)%c; b>>=1; } return s%c; } long long m,n; int main() { scanf("%lld %lld",&m,&n); int l=((m%c)*ksm(m-1,n-1))%c; printf(
"%lld",(ksm(m,n)-l+c)%c); return 0; }

[HNOI2008]越獄(luogu P3197)