#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;
}
总结
每个位置之间的等效性在之前牛客网(我记错了不是牛客网)的题中也出现过