题目链接:J. Abstract Painting.
ll mod=1e9+7;
int n,k;
bool used[1010][1010];
bool no[1010][1010];
ll dp[1010][1010][2];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
memset(used,0,sizeof used);
memset(used,0,sizeof no);
cin>>n>>k;
while(k--)
{
int c,r;cin>>c>>r;
used[c-r][c+r]=1;
for(int i=0;i<c-r;i++)
{
for(int j=c-r+1;j<c+r;j++)
{
no[i][j]=1;
}
}
for(int i=c-r+1;i<c+r;i++)
{
for(int j=c+r+1;j<=n;j++)
{
no[i][j]=1;
}
}
for(int i=0;i<n;i++)dp[i][i+1][0]=1;
for(int len=2;len<=n;len++)
{
for(int l=0,r=len;r<=n;l++,r++)
{
if(no[l][r])continue;
dp[l][r][0]=(dp[l+1][r][0]%mod+dp[l+1][r][1]%mod)%mod;
for(int m=l+2;m<=min(n,l+10);m+=2)
{
dp[l][r][0]=(dp[l][r][0]+dp[l][m][1]%mod*(dp[m][r][0]+dp[m][r][1])%mod)%mod;
}
if((r-l)%2==0&&(r-l)<=10)dp[l][r][1]=dp[l][r][0];
if(used[l][r])dp[l][r][0]=0;
}
}
cout<<(dp[0][n][0]%mod+dp[0][n][1]%mod)%mod<<"\n";
}
return 0;
}