多米諾骨牌 DOMINO
【題目描述】
Jzabc對多米諾骨牌有很大的興趣,然而他的骨牌比較特別,只有黑的和白的。他覺得如果存在連續三個骨牌是同種顏色的,那這個骨牌排列就是不美觀的。現在他有N個骨牌要排列,他想知道不美觀的排列的個數。他想請你幫忙進行統計不美觀排列的個數。
【輸入格式】
只有一個正整數,即要排列的骨牌的個數。
【輸出格式】
一個數,即不美觀的排列的個數。
【輸入樣例】
4
【輸出樣例】
6
解釋:有6中不美觀的排列。
【資料規模】
對於20%的資料,滿足N<=60
對於50%的資料,滿足N<=600
對於100%的資料,滿足N<=20000
一開始不會 就沒再做
後來小夥伴們提醒了一下有規律
於是打表1-10
發現G(i+1)可以由Gi*2+一個具有斐波那契數列性質的數列中某一項推出
所以遞推出的Gi
由於資料太大 用到了壓8位高精度
別人的題解是#include<iostream> #include<cstdio> #include<cstring> using namespace std; int f[4][811]; int z[811]; int m,n=1,a,b,c; void print(int s[811]) { int a; for(a=800;a>1;a--)if(s[a])break; cout<<s[a];a--; while(a) { if(s[a]<10000000)cout<<'0'; if(s[a]<1000000)cout<<'0'; if(s[a]<100000)cout<<'0'; if(s[a]<10000)cout<<'0'; if(s[a]<1000)cout<<'0'; if(s[a]<100)cout<<'0'; if(s[a]<10)cout<<'0'; cout<<s[a]; a--; } } void jinwei(int s[811]) { int a; for(a=1;a<=800;a++) if(s[a]>99999999) { s[a+1]=s[a+1]+s[a]/100000000; s[a]%=100000000; } } void addf() { int a; n++; n%=3; int l=(n-2+3)%3; int r=(n-1+3)%3; for(a=1;a<=800;a++)f[n][a]=f[l][a]+f[r][a]; jinwei(f[n]); } void cheng() { int a; for(a=1;a<=800;a++)z[a]*=2; jinwei(z); } void jia() { int a; for(a=1;a<=800;a++)z[a]+=f[n][a]; jinwei(z); } int main() { freopen("domino.in","r",stdin); freopen("domino.out","w",stdout); scanf("%d",&m); if(m<3) { cout<<0<<endl; return 0; } z[1]=2; f[0][1]=0; f[1][1]=2; for(a=4;a<=m;a++) { addf(); cheng(); jia(); } print(z); return 0; }
考慮美觀的情況,設f[i]為i個骨牌的排列中完美排列的數量。若在第i個位置上放與i-1個骨牌顏色相同的骨牌,則情況數為f[i-2],否則為f[i-1],那麼f[i]:=f[i-1]+f[i-2]。由二進位制的數量可得,此時不完美排列個數即為g[i]:=2^n-f[i]。
這個想法簡直是dbl...瞬間就跪爛了
我的理解是
當i與i-1顏色不同時
不會影響完美排列數 所以f[i]=f[i-1]
當顏色相同時
就有可能影響到完美排列
i-3i-2 i-1i
X0 11這種情況下 f[i]=f[i-1]=f[i-2] 因為從i-1到i顏色相同 i-1和i對f[i]沒做出貢獻 與f[i-2]相比 f[i]既沒增加也沒減少
X1 11這種情況下f[i]=f[i-2] 因為從i-2到i顏色相同 i-1和i對f[i]沒做出貢獻 與f[i-2]相比 f[i]既沒增加也沒減少
所以f[i]=f[i-1]+f[i-2]
不完美的就是2^n-f[i]
Orz