/********************************************************** 一次元セルオートマトンルール110を1段目に適用した結果である2段目が 与えられるのであり得る1段目の種類数を出力するプログラム 入力:列数N、2段目のi列目の数値0か1 出力:2段目を生成できる1段目の種類数を10^9+7で割った余り **********************************************************/ #include #include /* グローバル変数 */ int* first; /* 1段目の数列*/ int* second; /* 2段目の数列 */ int n; /* 列数N */ long long int saiki(int); /* 1段目の数列の種類数を求める再帰関数 */ int ismatch(int, int, int, int, int, int, int); /* 一次元セルオートマトンルールの上段の値の列毎の比較と一次元セルオートマトンの上段の値を仮定して決める関数 */ int main(){ int i; /* カウンタ */ long long int count; /* 1段目の数列の種類数 */ scanf("%d",&n); /* 列数Nの入力 */ first = (int*)calloc(n,sizeof(int)); /* 1段目の数列の領域確保 */ second = (int*)calloc(n,sizeof(int)); /* 2段目の数列の領域確保 */ for(i=0; i= n - 2 ){ /* 2段目の現在の列がn-1かn列目の時 */ /* 一次元セルオートマトンの上段の値の列毎の比較 */ if( first[num1] == i1 && first[num2] == i2 && first[num3] == i3 ) flag = 1; }else if( stage != 0 ){ /* 2段目の現在の列が1列目以外の時 */ /* 一次元セルオートマトンの上段の値の列毎の比較 */ if( first[num1] == i1 && first[num2] == i2 ){ flag = 1; first[num3] = i3; /* 次の列の一次元セルオートマトンの上段の値を仮定する */ } }else{ /* 2段目の現在の列が1列目の時 */ /* 一次元セルオートマトンの上段の値3つ全てを仮定する */ first[num1] = i1; first[num2] = i2; first[num3] = i3; flag = 1; /* 1列目の時は無条件で判定OKとする */ } return flag; }