双状态dp,hack WA.
#include <bits/stdc++.h>
using namespace std;
bool gcd[301][301];
int mem[301][301];
int tun[301][301];
int tune(int i,int j){
if(i==1||j==1){
return 0;
}else if(tun[i][j]!=-1){
return tun[i][j];
}
else{
if(gcd[i][j]){
int r1=min(tune(i-1,j),tune(i,j-1));
int r2=max(tune(i-1,j),tune(i,j-1));
if(r1==0){
if(r2==0) return tun[i][j]=1;
if(r2==1) return tun[i][j]=2;
if(r2==2) return tun[i][j]=1;
}else if(r1==1){
if(r2==1) return tun[i][j]=2;
if(r2==2) return tun[i][j]=2;
}else{
if(r2==2) return tun[i][j]=1;
}
}else return tun[i][j]=0;
}
}
int dp(int i,int j){
if(i==1||j==1){
return 0;
}else if(mem[i][j]!=-1){
return mem[i][j];
}
else{
auto tot=dp(i-1,j)+dp(i,j-1)-dp(i-1,j-1);
auto tn=tune(i,j);
if(tn==0){
;
}else if(tn==1){
tot++;
}else{
;
}
return mem[i][j]=tot;
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
gcd[i][j]=((__gcd(i,j)==1)?0:1);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mem[i][j]=-1;tun[i][j]=-1;
}
}
cout<<dp(n,n);
}