ichirin2501's diary

いっちりーん。

265:Binary Circles

新しい問題が出たので覗いてみたら好みな問題だったので解いてみた。
これでProjectEuler計103問、一応Level3だけど実感なし。

Project Euler 265

Problem 265 - Project Euler
2進数の数列を時計回りにしたとき、N桁の数列全てが出現する2進数の和を求めよ〜
という問題です。かなり端折った。
普通に全探索。

string num[]={"00010","00011","00100","00101","00110","00111","01000","01001",
              "01010","01011","01100","01101","01110","01111","10000","10001",
              "10010","10011","10100","10101","10110","10111","11000","11001",
              "11010","11011","11100","11101","11110","11111"};
int num_flag[30];
long long ans;

void search(string str,int c)
{
  if(c==32){
    ans+=strtol(str.substr(0,1<<5).c_str(),0,2);
  }
  else{
    for(int i=0;i<30;i++){
      if(num_flag[i])continue;
      int j,k=0;
      for(j=str.size()-4;j<str.size();j++){
        if(str[j]!=num[i][k++])break;
      }
      if(j!=str.size())continue;
      num_flag[i]=1;
      search(str+num[i][4],c+1);
      num_flag[i]=0;
    }
  }
  return;
}

int main()
{
  search("000001",2);
  cout<<"ans:"<<ans<<endl;
  return 0;
}

「続きはこちら」的な機能ないのかな。
長いソースコードをそのまま表示させると邪魔になる。