为什么T了,60???DALAO有愿意指导卡常的吗??
查看原帖
为什么T了,60???DALAO有愿意指导卡常的吗??
180924
FLAT_LCH楼主2022/3/10 22:20
#include <iostream> 
#include <cstdio>
#include <cstdlib>
#include <cstring>

//#define mod 998244353
//#define ll __int128
#define ll long long

using namespace std;

int ni[1100];
int t,m,n,cnt=0;
int id[20][20][20]={};
ll mod=998244353;


struct node
{
	int s[167][167];
	inline void cleann(){memset(s,0,sizeof(s));}
	inline node operator *(const node &y)const 
	{
		node z;
		for(int i=1;i<=cnt;i++)
		{
			for(int j=1;j<=cnt;j++)
			{
				__int128 tt=0;
				for(int k=1;k<=cnt;k++)
				{
					if(s[i][k]&&y.s[k][j])tt+=1ll*s[i][k]*y.s[k][j];
					//if(s[i][k]&&y.s[k][j])z.s[i][j]=(z.s[i][j]+s[i][k]*y.s[k][j])%mod;
				}
				z.s[i][j]=tt%mod;
			}
		}
		return z;
	}
}p[100];

inline ll rd()
{
	ll s=0;char x='x';
	while(x<'0'||x>'9')x=getchar();
	while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
	return s;
}

void exgcd(int a,int b,int &x,int &y)
{
	if(b==0)x=1,y=0;
	else exgcd(b,a%b,y,x),y-=a/b*x;
}

inline int getni(int a,int p)
{
	int x,y;
	exgcd(a,p,x,y);
	return (x%p+p)%p;
}

inline void print(ll s)
{
	int l=0;char a[100];
	do
	{
		a[++l]=s%10+'0';
		s/=10;
	}while(s);
	while(l)putchar(a[l--]);
	putchar('\n');
}

int main()
{
	t=rd();m=rd();n=rd();
	
	for(int i=1;i<=100;i++)ni[i]=getni(i,mod);
	
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=(m>=2?n-i:0);j++)
		{
			for(int k=0;k<=(m==3?n-i-j:0);k++)
			{
				id[i][j][k]=++cnt;
			}
		}
	}
	
	++cnt;p[0].s[cnt][cnt]=1;
	
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=(m>=2?n-i:0);j++)
		{
			for(int k=0;k<=(m>=3?n-i-j:0);k++)
			{
				int pos=id[i][j][k],iv=ni[i+j+k+1],add=i+j+k<n;
				if(m==1)
				{
					if(i)p[0].s[pos][id[i-1][j][k]]=(1ll*i*iv)%mod;
				}
				else if(m==2)
				{
					if(i)p[0].s[pos][id[i-1][j][k]]=(1ll*i*iv)%mod;
					if(j)p[0].s[pos][id[i+1][j-1+add][k]]=(1ll*j*iv)%mod;
				}
				else if(m==3)
				{
					if(i)p[0].s[pos][id[i-1][j][k]]=(1ll*i*iv)%mod;
					if(j)p[0].s[pos][id[i+1][j-1][k+add]]=(1ll*j*iv)%mod;
					if(k)p[0].s[pos][id[i][j+1][k-1+add]]=(1ll*k*iv)%mod;
				}
				p[0].s[pos][pos]=p[0].s[pos][cnt]=iv;
			}
		}
	}
	
	for(int i=1;i<=90;i++)p[i]=p[i-1]*p[i-1];
	
	ll a;
	for(int i=1;i<=t;i++)
	{
		a=rd();
		node ans;ans.cleann();
		ans.s[1][id[m==1][m==2][m==3]]=1;
		for(ll j=0;a;j++)
		{
			if(a&1)ans=ans*p[j];
			a>>=1;
		}
		print(ans.s[1][cnt]);
		//printf("%lld\n",ans.s[1][cnt]);
	}
	return 0;
}
2022/3/10 22:20
加载中...