漸化式を探索するだけです。
計算時間1秒。
#include<stdio.h>
#include<map>
#include<iostream>
std::map<unsigned int,__int64> ms[11];
void f(int p,unsigned int d,unsigned int u,__int64 c,int r){
if(p+2==32||p+3==32){
ms[r][u]+=c;
}else{
if(p+2<=32){
int p1=p+2;
if(((d>>(p1-1))&1)==0){
f(p1,d,u+(1<<(p1-1)),c,r);
}
}
if(p+3<=32){
int p1=p+3;
if(((d>>(p1-1))&1)==0){
f(p1,d,u+(1<<(p1-1)),c,r);
}
}
}
}
int main(){
ms[0][0]=1;
std::map<unsigned int,__int64>::iterator it;
for(int i=1;i<=10;i++){
for(it=ms[i-1].begin();it!=ms[i-1].end();it++){
unsigned int d=(*it).first;
__int64 c=(*it).second;
f(0,d,0,c,i);
}
}
__int64 ans=0;
for(it=ms[10].begin();it!=ms[10].end();it++){
ans+=(*it).second;
}
std::cout<<ans<<"\n";
}
最終更新:2016年01月24日 06:01