(萌新)D - 小A的线段(easy version):已知m<10,数量较小,可以直接暴力状态压缩(即每条线段只有两种状态:选或不选,所以对于m条线段最多就有2的m次方种可能)我们可以令0为不选,1为选,则所有线段的选择情况可以用01字符串来表示,这与二进制的表达方式相同,于是我们可以将1到2的m次方的数以二进制表示就可以囊括所有的选择情况,以下为代码部分:
#include<iostream>
using namespace std;
bool change(int q,int a[][2],int n,int m) //二进制状态压缩状态
{
int k=m-1; //二进制逆向排序
int s[n];
bool f=true;
for(int i=0;i<n;i++) //初始化数组
s[i]=0;
while(q>0) //状态压缩
{
if(q&1)
{
for(int j=a[k][0];j<=a[k][1];j++) //标记点
s[j-1]++;
}
q>>=1;
k--;
}
for(int i=0;i<n;i++)
if(s[i]<2)
f=false;
return f;
}
int main()
{
int n,m,ans=0;
cin>>n>>m;
int a[m][2];
for(int i=0;i<m;i++)
cin>>a[i][0]>>a[i][1];
int mm=1<<m;
for(int i=1;i<mm;i++)
{
if(change(i,a,n,m))
{
ans++;
ans%=998244353;
}
}
cout<<ans<<endl;
return 0;
}