#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
inline int qread()
{
int a=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){(a*=10)+=(ch^48);ch=getchar();}
return a*f;
}
int T,n,k,tot,op,to[9000][10],f[9000],g[9000],l[1010],r[1010],ans;
inline void Mod(int &x)
{
if(x>=mod)x-=mod;
return ;
}
map< vector<int> , int >mp;
inline int dfs(vector<int>s)
{
if(mp[s])return mp[s];
int id=mp[s]=++tot;
for(int i=0;i<=6;++i)
{
vector<int>cx(9,101);
for(int j=0;j<=2;++j)for(int k=0,nd;k<=2;++k)
{
nd=s[j*3+k];
if(nd==101)continue;
for(int p=0,x;p<=2;++p)
{
x=i-j-k-p;
x=x<0?-x:(x==1?1:0);
for(int l=k;l<=min(2,k+j);++l)cx[l*3+p]=min(cx[l*3+p],nd+x);
}
}
to[id][i]=dfs(cx);
}
return id;
}
int main()
{
vector<int>iS(9,101);iS[0]=0;
dfs(iS);
T=qread();
while(T--)
{
n=qread();k=qread();ans=0;
for(int i=1;i<=n;++i)l[i]=qread(),r[i]=qread();
memset(f,0,sizeof(f));f[1]=1;
for(int i=1;i<=n;++i)
{
memset(g,0,sizeof(g));
for(int j=1;j<=8765;++j)
{
if(!f[j])continue;
for(int k=0,x;k<=6;++k)
{
x=0;
if(k<6)x=(l[i]<=k&&k<=r[i]);
else if(r[i]>=6)x=r[i]-max(6,l[i])+1;
Mod(g[to[j][k]]+=(1ll*f[j]*x)%mod);
}
}
swap(f,g);
}
for(pair< vector<int> , int >i:mp)if(i.first[0]<=k)Mod(ans+=f[i.second]);
if(k==1)
{
op=1;
for(int i=1;i<=n;++i)op&=!l[i];
if(op)--ans;
if(n==3&&l[1]<=1&&r[1]>=1&&l[2]<=1&&r[2]>=1&&l[3]<=1&&r[3]>=1)--ans;
}
Mod(ans+=mod);
printf("%d\n",ans);
}
return 0;
}
这份代码仅将第 15 行处的 if 换成 while 便会 TLE,在洛谷和 LOJ 都是这样,效率差距在两倍以上
但是在本地跑同样的数据,两份代码几乎没有效率的差距,这是为什么???qwq