BZOJ 1008 越狱

       这道题我放了很久没有做,就是因为数据太大没什么好方法,直到后来受大神指点才发现,一道数学题被我卡死这么久。

       这道题的关键就是逆向思维,所谓逆向思维就是倒着想,既然题让我们求越狱的情况数,这个不好求,我们不妨求一下不越狱的情况数,这样用总数一减即可,根据数学思想,n个房间,m种宗教,则共有m的n次方种总可能数,不越狱的情况有m乘(m-1)的(n-1)次方个,那么结果就是两者相减,但是别急,这样算你依然会错,因为次方运算太慢,所以你还需要用到快速幂。

       代码如下:

#include<cstdio>
#include<cstdlib> 
#include<iostream>

#define mod 100003
using namespace std;

long long int i_kinds,i_room;
long long int i_result,i_temp;

long long int multiply(long long int a,long long int x)
{
    long long int b=1;
    while(x>0){
        if(x&1){
          b=b*a%mod;
        }
        a=a*a%mod;
        x=x>>1;
    }
    return b;
}
int main()
{
    scanf("%lld%lld",&i_kinds,&i_room);
    
    i_kinds=i_kinds%mod;
    i_temp=multiply(i_kinds,i_room)%mod;
    i_result=i_temp;
    i_temp=i_kinds*multiply(i_kinds-1,i_room-1)%mod;
    i_result=i_result+mod-i_temp;
    i_result=i_result%mod;
    
    printf("%lld",i_result);
    
    return 0;
}
感谢各位阅读我的博客,希望大家能有所收获,谢谢。
posted @ 2015-08-05 14:51  wlxy  阅读(89)  评论(0编辑  收藏