两份代码求调其中一份
调了几个小时了 QwQ
fi,j,w 表示已选的数构成的数列的权值和,其中,i 表示已选的数(ai)的数量,j 表示目前 S 在二进制下已有的 1 的数量,w 表示二进制下对下一位进位的值
代码 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;
}