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;
}

 

posted @ 2017-10-22 20:21  或是七一  阅读(59)  评论(0编辑  收藏  举报