求助高精度
查看原帖
求助高精度
160839
Prean楼主2020/5/4 16:30

RT,高精度写挂惹QwQ

插头DP部分不用管,从模板题复制过来的

Code:

#include<iostream>
#include<cstring>
struct ll
{
    int len,a[45];
	ll(){len=0;memset(a,0,sizeof(a));}
    friend std::ostream&operator<<(std::ostream&a,ll n)
    {
        for(int i=n.len;i;--i)putchar(n.a[i]^48);
        return a;
    }
    friend ll&operator+=(ll&a,ll b)
    {
        int i;
        if(b.len>a.len)a.len=b.len;
        for(i=1;i<=a.len;++i)a.a[i]+=b.a[i];
        for(i=1;i<=a.len;++i)a.a[i+1]+=a.a[i]/10,a.a[i]%=10;
        if(a.a[a.len+1])++a.len;
        return a;
    }
}ans;
int n,m,x,y,now,lst,cnt[2],bit[15];
class Hash{public:int sta;ll num;Hash*nx;}s[2][1<<23],*h[300000];
inline void Insert(int sta,ll num)
{
	int T=sta%300000;
	for(Hash*i=h[T];i;i=i->nx)if(sta==i->sta)return void(i->num+=num);
	s[now][++cnt[now]]={sta,num,h[T]};h[T]=s[now]+cnt[now];
}
inline ll QwQ()
{
	ll a;
	a.len=1;a.a[1]=1;
	return a;
}
signed main()
{
	int i,j,k;std::cin>>n>>m;
	for(i=0;i<=m;++i)bit[i]=1<<(i<<1);Insert(0,QwQ());
	for(i=1;i<=n;++i)
	{
		for(j=1;j<=cnt[now];++j)s[now][j].sta<<=2;
		for(j=1;j<=m;++j)
		{
			lst=now;cnt[now^=1]=0;memset(h,NULL,sizeof(h));
			for(k=1;k<=cnt[lst];++k)
			{
				int pnt=s[lst][k].sta,N=pnt/bit[j]&3,W=pnt/bit[j-1]&3;
				ll&const num=s[lst][k].num;
				if(!W&&!N)
				{
					Insert(pnt+bit[j]*2+bit[j-1]*1,num);
					continue;
				}
				if(!W&&N)
				{
					Insert(pnt,num);
					Insert(pnt-bit[j]*N+bit[j-1]*N,num);
					continue;
				}
				if(W&&!N)
				{
					Insert(pnt,num);
					Insert(pnt+bit[j]*W-bit[j-1]*W,num);
					continue;
				}
				if(W==1&&N==1)
				{
					int nm=0,pst=j;
					for(;pst<=m;++pst)
					{
						int s=pnt/bit[pst]&3;
						if(s==1)++nm;if(s==2)--nm;
						if(!nm)break;
					}
					Insert(pnt-bit[j]*N-bit[j-1]*W-bit[pst]*1,num);
					continue;
				}
				if(W==2&&N==2)
				{
					int nm=0,pst=j-1;
					for(;pst>=0;--pst)
					{
						int s=pnt/bit[pst]&3;
						if(s==1)++nm;if(s==2)--nm;
						if(!nm)break;
					}
					Insert(pnt-bit[j]*N-bit[j-1]*W+bit[pst]*1,num);
					continue;
				}
				if(W==2&&N==1)
				{
					Insert(pnt-bit[j]*N-bit[j-1]*W,num);
					continue;
				}
				if(W==1&&N==2)
				{
					if(i==x&&j==y)ans+=num;
					continue;
				}
			}
		}
	}
	ans+=ans;std::cout<<ans;
}
2020/5/4 16:30
加载中...