大致思路就是将图案分为一个个环套在一起,

然后用图来观察关系,再用容斥原理dp即可。

#include<iostream>
#include<memory.h>
#include<algorithm>
#define maxlon 100
using namespace std;

struct bigmun{
    int s[maxlon],lon;
    void clear(){
        for(int i=lon;i>=0;i--)
        if(s[i]){lon=i;break;}
    }
    void csh(){
        memset(s,0,sizeof(s));
        lon=0;
    }
    bigmun operator -(const bigmun &b)const{
        bigmun Ans=*this;
        for(int i=b.lon;i>=0;i--)
            Ans.s[i]-=b.s[i];
        for(int i=0;i<=Ans.lon;i++)
        if(Ans.s[i]<0)
        Ans.s[i+1]--,Ans.s[i]+=10;
        Ans.clear();
        return Ans;
    }
    bigmun operator +(const bigmun &b)const{
        bigmun Ans=*this;
        Ans.lon=max(Ans.lon,b.lon)+1;
        for(int i=b.lon;i>=0;i--)
            Ans.s[i]+=b.s[i];
        for(int i=0;i<=Ans.lon;i++)
        if(Ans.s[i]>=10)
        Ans.s[i+1]++,Ans.s[i]-=10;
        Ans.clear();
        return Ans;
    }
    bigmun operator *(const bigmun &b)const{
        //cout<<"cz:\n";
        bigmun Ans;Ans.lon=b.lon+lon+1;
        memset(Ans.s,0,sizeof(Ans.s));
        for(int i=0;i<=lon;i++)
        for(int j=0;j<=b.lon;j++)
        Ans.s[i+j]+=s[i]*b.s[j];
        for(int i=0;i<=Ans.lon;i++)
        if(Ans.s[i]>=10)
        Ans.s[i+1]+=Ans.s[i]/10,
        Ans.s[i]%=10;
        Ans.clear();
        //Ans.coutt();
        return Ans;
    }
    bigmun cheng(int n){
        for(int i=0;i<=lon;i++)s[i]*=n;
        for(int i=0;i<=lon;i++)
        if(s[i]>=10)
        s[i+1]+=s[i]/10,s[i]%=10;
        lon++;
        clear();
        return *this;
    }
    void chu(int b){
        bigmun Ans;Ans.csh();Ans.lon=lon;
        int c=0,cur=lon;
        while(cur>=0){
            c=c*10+s[cur];
            if(c>=b){
                Ans.s[cur]+=c/b;
                c%=b;
            }
            cur--;
        }
        Ans.clear();
        *this=Ans;
    }
    void coutt(){
        for(int i=lon;i>=0;i--)
        cout<<s[i];
        cout<<endl;//
    }
}mi2[211],ans[4];
void csh(){
    mi2[0].csh();mi2[0].s[0]=1;
    mi2[1].csh();mi2[1].s[0]=2;
    for(int i=1;i<=210;i++)
    mi2[i]=mi2[i-1]*mi2[1];//,mi2[i].coutt();
    ans[1].csh();ans[1].s[0]=1;
}
int n,tot;
int f[4];//3xuanfan,1kexuanzhuan,2kefanzhuan;
int main(){
    cin>>n;if(n==1){cout<<2;return 0;}
    csh();int nn=n;
    while(nn>0){
        if(nn==n){
            ans[1]=(mi2[nn-1]-mi2[(nn+1)/2]);
            ans[1].chu(2);
        }
        else if(nn==1)ans[1].cheng(2);
        else if(nn==2)ans[1].cheng(2);
        else if(nn==3)ans[1].cheng(4);
        else{
            bigmun a2=(mi2[nn-1]-mi2[(nn+1)/2]);
            a2.chu(2);
            ans[1]=mi2[1]*ans[1]*a2+ans[1]*mi2[(nn+1)/2]+a2*mi2[f[3]];
        }
        f[3]+=(nn+1)/2;
        f[2]+=nn-1+(nn+1)/2;
        nn-=3;
        //ans[1].coutt();
    }
    ans[2]=mi2[f[2]];
    ans[3]=mi2[f[3]];
    //ans[1]=ans[1]-ans[3];
    ans[2]=ans[2]-ans[3];
    //ans[1].coutt();
    //ans[2].coutt();
    //ans[3].coutt();
    bigmun Ans=mi2[(n+1)*n/2]+(ans[1].cheng(4))+(ans[2].cheng(3))+(ans[3].cheng(5));
    //mi2[(n+1)*n/2].coutt();
    Ans.chu(6);
    Ans.coutt();
    return 0;
}