45pts 玄关求调 QwQ 有注释
查看原帖
45pts 玄关求调 QwQ 有注释
945401
Emperor_Yan楼主2024/11/20 21:30

两份代码求调其中一份
调了几个小时了 QwQ

fi,j,wf_{i,j,w} 表示已选的数构成的数列的权值和,其中,ii 表示已选的数(aia_i)的数量,jj 表示目前 SS 在二进制下已有的 1 的数量,ww 表示二进制下对下一位进位的值

WA数据

代码 A:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int N=3e1+5;
const int M=1e2+5;
const int P=998244353;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

int n,m,k,a[M];
ll f[N][N][N],C[N][N],ans;

inline ll fast_pow(ll x,ll p)//快速幂
{
	ll res=1;
	do
	{
		if(p&1)
		{
			res*=x;
			res%=P;
		}
		x*=x;
		x%=P;
	}while(p>>=1);
	return res;
}

void C_init()//预处理组合数
{
	C[0][0]=1;
	for(int i=1;i<=n;i++)
	{
		C[i][0]=1;
		for(int j=1;j<=i;j++)
		{
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%P;
		}
	}
}

int main()
{
//	freopen("sequence2.in","r",stdin);
//	freopen("sequence.out","w",stdout);
	
	n=read();m=read();k=read();
	C_init();
	for(int i=0;i<=m;i++)
	{
		a[i]=read();
	}
	for(int x=0;x<=m;x++)
	{
		for(int i=n;i>=1;i--)
		{
			for(int j=0;j<=k;j++)//不选 x 时
			{
				for(int w=1;w<=n;w++)
				{
					if(j+(w&1)>k||!f[i][j][w]) continue;
					f[i][j+(w&1)][w>>1]+=f[i][j][w];
					f[i][j+(w&1)][w>>1]%=P;
					f[i][j][w]=0;
				}
			}
			for(int d=1;d<=i;d++)//d 表示该数字 x 被选了d次
			{
				for(int j=0;j<=k;j++)
				{
					for(int w=0;w<=n;w++)
					{
						int temp1=j+((w+d)&1),temp2=(w+d)>>1;
						if(temp1>k||!f[i-d][j][w]) continue;
						f[i][temp1][temp2]+=(f[i-d][j][w]*fast_pow(a[x],d)%P)*C[i][d];
						f[i][temp1][temp2]%=P;
					}
				}
			}
		}
		
		for(int d=1;d<=n;d++)//第一次选数字时
		{
			f[d][d&1][d>>1]+=fast_pow(a[x],d);
			f[d][d&1][d>>1]%=P;
		}
	}
	for(int x=m+1;x<=m+5;x++)
	{
		for(int j=0;j<=k;j++)//d=0
		{
			for(int w=1;w<=n;w++)
			{
				if(j+(w&1)>k) continue;
				f[n][j+(w&1)][w>>1]+=f[n][j][w];
				f[n][j+(w&1)][w>>1]%=P;
				f[n][j][w]=0;
			}
		}
	}
	for(int j=0;j<=k;j++)
	{
		ans+=f[n][j][0];
		ans%=P;
	}
	printf("%lld",ans);
	
	return 0;
}

代码 B:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int N=3e1+5;
const int M=1e2+15;
const int P=998244353;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

int n,m,k,a[M];
ll f[M][N][N][N],C[N][N],ans,dt[N][N];

inline ll fast_pow(ll x,ll p)
{
	ll res=1;
	do
	{
		if(p&1)
		{
			res*=x;
			res%=P;
		}
		x*=x;
		x%=P;
	}while(p>>=1);
	return res;
}

void C_init()
{
	C[0][0]=1;
	for(int i=1;i<=n;i++)
	{
		C[i][0]=1;
		for(int j=1;j<=i;j++)
		{
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%P;
		}
	}
}

int main()
{
//	freopen("P7961_2.in","r",stdin);
//	freopen("sequence2.in","r",stdin);
//	freopen("sequence.out","w",stdout);
	
	n=read();m=read();k=read();
	C_init();
	for(int i=0;i<=m;i++)
	{
		a[i]=read();
	}
	
	for(int x=0;x<=m;x++)
	{
		for(int d=1;d<=n;d++)
		{
			f[x][d][d&1][d>>1]+=fast_pow(a[x],d);
			f[x][d][d&1][d>>1]%=P;
//			printf(">>f[%d][%d][%d][%d]=%lld\n",x,d,d&1,d>>1,f[x][d][d&1][d>>1]);///
		}
		
		if(x)
		for(int i=1;i<=n;i++)
		{
			for(int j=0;j<=k;j++)//d=0
			{
				for(int w=1;w<=n;w++)
				{
					if(j+(w&1)>k||!f[x-1][i][j][w]) continue;
					f[x][i][j+(w&1)][w>>1]+=f[x-1][i][j][w];
					f[x][i][j+(w&1)][w>>1]%=P;
//					printf("-f[%d][%d][%d][%d]=%lld\n",x,i,j+(w&1),w>>1,f[x][i][j+(w&1)][w>>1]);///
				}
			}
			for(int d=1;d<=i;d++)
			{
				for(int j=0;j<=k;j++)
				{
					for(int w=0;w<=n;w++)
					{
						int temp1=j+((w+d)&1),temp2=(w+d)>>1;
						if(temp1>k||!f[x-1][i-d][j][w]) continue;
						f[x][i][temp1][temp2]+=(f[x-1][i-d][j][w]*fast_pow(a[x],d)%P)*C[i][d];
						f[x][i][temp1][temp2]%=P;
//						printf(">f[%d][%d][%d][%d]=%lld\n",x,i,temp1,temp2,f[x][i][temp1][temp2]);///
					}
				}
			}
		}
	}
	for(int x=m+1;x<=m+5;x++)
	{
		for(int j=0;j<=k;j++)//d=0
		{
			for(int w=1;w<=n;w++)
			{
				if(j+(w&1)>k||!f[x-1][n][j][w]) continue;
				f[x][n][j+(w&1)][w>>1]+=f[x-1][n][j][w];
				f[x][n][j+(w&1)][w>>1]%=P;
//				printf("-f[%d][%d][%d][%d]=%lld\n",x,n,j+(w&1),w>>1,f[x][n][j+(w&1)][w>>1]);///
			}
		}
	}
	for(int x=m;x<=m+5;x++)
	for(int j=0;j<=k;j++)
	{
		ans+=f[x][n][j][0];
		ans%=P;
	}
	printf("%lld",ans);
	
	return 0;
}
2024/11/20 21:30
加载中...