题目链接
【题解】洛谷P4996[【LGR-055】洛谷11月月赛]C.咕咕咕 组合数
【题解】洛谷P4996[【LGR-055】洛谷11月月赛]C.咕咕咕 组合数
【题解】洛谷P4996[【LGR-055】洛谷11月月赛]C.咕咕咕 组合数
【题解】洛谷P4996[【LGR-055】洛谷11月月赛]C.咕咕咕 组合数


【题解】洛谷P4996[【LGR-055】洛谷11月月赛]C.咕咕咕 组合数
【题解】洛谷P4996[【LGR-055】洛谷11月月赛]C.咕咕咕 组合数
【题解】洛谷P4996[【LGR-055】洛谷11月月赛]C.咕咕咕 组合数
【题解】洛谷P4996[【LGR-055】洛谷11月月赛]C.咕咕咕 组合数

#include<cstdio>
const int mod=998244353;
typedef long long ll;
inline int read()
{
	int s=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9')s=(s<<1)+(ch^48),ch=getchar();
	if(f)s=-s;return s;
}
int n,m;
inline int get1(int x)
{
	int ret=0;
	for(;x;x-=x&-x)ret++;
	return ret;
}
ll c[21][21],cnt[21],ans;
int main()
{
	//freopen("in.txt","r",stdin);
    cnt[0]=c[1][0]=c[1][1]=1;
	for(int i=2;i<=20;i++)
    {
    	c[i][0]=1;
    	for(int j=1;j<=20;j++)
    	    c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
	}
	for(int i=1;i<=20;i++)
	    for(int j=1;j<=i;j++)
	        cnt[i]=(cnt[i]+cnt[i-j]*c[i][j])%mod;
	scanf("%d%d",&n,&m);
	for(int i=1,s,a,one;i<=m;i++)
	{
		s=read();scanf("%d",&a);one=get1(s);
	    ans=(ans+(a*cnt[one]%mod*cnt[n-one]%mod))%mod;
	}
	printf("%lld\n",ans);
	return 0;
}

总结

每个位置之间的等效性在之前牛客网(我记错了不是牛客网)的题中也出现过

相关文章: