有n個有信仰的人,信仰共m種,每個人只有一種信仰,當兩個相同信仰的人遇到一起,他們便會逃走,求有多少中排列方式使得可能有人逃走, 即存在兩個相同信仰的人相鄰,答案對100003取模。
第一種:首先我我們考慮f [ i ]代表前i個連續的人可能逃走的可能方案。當前面i - 1個人中已經會有人逃跑了,第i個人的信仰就無關緊要,可以是m中的任意一種,則f [ i ] = f [ i - 1 ] * m;當前面i - 1個人中沒有要越獄的,那麼第i個人只能與前乙個人的信仰相同,那麼也就是等於前i - 1個人沒有相鄰的情況=總的-相鄰的,則f [ i ] = m ^ ( i - 1 ) - f [ i - 1]。
第二種:設f [ i ]代表前i個連續的人不逃走的可能方案數,那麼可能的方案數=總方案( m ^ n ) - f [ n ]。當前面i - 1 個人中已經會有人要逃跑了,第i個人加進去也會發生越獄,那麼情況為0;當前面i - 1個人中沒有要越獄的,那麼第i個人不能和前乙個人的信仰相同,否則就會逃跑,就有m - 1種選擇,則f [ i ] = f [ i - 1 ] * ( m - 1 )。f [ 1 ] = m,第乙個人可以任意選擇。
顯然第二種比較好,快速冪一下。
#include using namespace std;
const int mod = 100003;
typedef long long ll;
ll m, n;
ll pom(ll m, ll n)
return ret;
}int main()
bzoj1008 越獄 組合數學
監獄有連續編號為1 n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 輸入兩個整數m,n.1 m 10 8,1 n 10 12 可能越獄的狀態數,模100003取餘 2 366種狀態為 000 001 ...
BZOJ 1008 越獄(組合數學)
思路 首先全部情況有m n種,不滿足題意的情況有m m 1 n 1 種情況,然後快速冪就好啦 include includeusing namespace std define ll long long define mod 100003 ll powmod ll a,ll b return ans...
BZOJ 1008 越獄(組合數學)
description 監獄有連續編號為 1.n 1.n的 n n 個房間,每個房間關押乙個犯人,有 m role presentation style position relative m m種宗教,每個犯人可能信仰其中一種。如果 相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生...