大致思路就是将图案分为一个个环套在一起,
然后用图来观察关系,再用容斥原理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;
}
京公网安备 11010502036488号