[HNOI2008]越獄(luogu P3197)
阿新 • • 發佈:2017-10-25
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 longlong 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)