标签: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;
}
标签:char noi getc tor def pac ret write highlight
原文地址:http://www.cnblogs.com/HC-LittleJian/p/7738632.html