bzoj 1008
补集思想。快速幂。
总方案数为M^N。
不会发生越狱的方案数就是(M-1)^(N-1)*M。(第一个人随便选,后面的人不能选和前面一个人一样的宗教。)
可能会发生越狱的方案数=总方案数-不会发生越狱的方案数。
主要输出的时候可能减出来一个负数,所以要加上一个100003。
两种快速幂写法。
递归。
#include<cstdio> #define P 100003 typedef long long ll; ll m,n; ll calc(ll m,ll n){ m%=P; if(n==1) return m; if(n&1) return calc(m,n-1)*m%P; ll mid=calc(m,n>>1); return mid*mid%P; } int main(){ scanf("%lld%lld",&m,&n); printf("%lld",(calc(m,n)-m*calc(m-1,n-1)%P+P)%P); return 0; }
下面这个应该算倍增。
#include<cstdio> #define P 100003 typedef long long ll; ll m,n; ll calc(ll m,ll n){ m%=P; ll ans=1; for(;n;n>>=1,m=m*m%P) if(n&1) ans=ans*m%P; return ans; } int main(){ scanf("%lld%lld",&m,&n); printf("%lld",(calc(m,n)-m*calc(m-1,n-1)%P+P)%P); return 0; }