码迷,mamicode.com
首页 > 其他好文 > 详细

HNOI2008 越狱

时间:2017-10-26 19:59:54      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:char   noi   getc   tor   def   pac   ret   write   highlight   

题目:

  监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。

思路:

  可以发现直接求状态数不是很好求,但我们可以很轻松的求出状态总数和不符合题目要求的状态数(N ^ M 和 ( N - 1 ) ^ ( M - 1 ) * M)。

  所以注意下取模再作差即可。

代码:

#include <bits/stdc++.h>
#define MOD 100003
using namespace std;
typedef unsigned long long ull;
ull mul(ull a,ull b){
ull ans=0;
	if(a<b)
		swap(a,b);
	while(b){
		if(b&1)
			ans+=a;
		a<<=1;
		ans%=MOD;
		a%=MOD;
		b>>=1;
	}
	return ans;
}
ull power(ull a,ull b){
ull ans=1ll;
	a%=MOD;
	while(b){
		if(b&1)
			ans=mul(a,ans);
		a=mul(a,a);
		ans%=MOD;
		a%=MOD;
		b>>=1;
	}
	return ans;
}
void read_ull(ull &a){
char c=getchar();
bool f=false;
    a=0;
    while(!isdigit(c))
		c=getchar();
    while(isdigit(c)){
        a=(a<<1)+(a<<3)+c-‘0‘;
        c=getchar();
    }
    if(f)
        a=~a+1;
}
void write_ull(ull a){
ull s[100],top=0;
    if(!a){
        putchar(‘0‘);
        return;
    }
    while(a){
        s[top++]=a%10;
        a/=10;
    }
    top--;
    while(~top)
        putchar(s[top--]+‘0‘);
}
struct IOer{
    IOer operator << (ull a){
        write_ull(a);
        return *this;
    }
    IOer operator << (char c){
        putchar(c);
        return *this;
    }
    IOer operator >> (ull &a){
        read_ull(a);
        return *this;
    }
};
int main(){
ull n,m;
IOer io;
	io>>m>>n;
	io<<(power(m,n)-mul(m,power(m-1,n-1))+MOD)%MOD<<‘\n‘;
	return 0;
}

 

HNOI2008 越狱

标签:char   noi   getc   tor   def   pac   ret   write   highlight   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7738632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!