标签: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