版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/83004785
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=990804011;
int k,dp[55][1<<10];
ll l[12],r[12],a[12];
int doit(int d,int s)
{
if(d==-1)
return 1;
int &res=dp[d][s];
if(~res)
return res;
res=0;
int st=s;
for(int i=1;i<=k;i++)
if((s&(1<<i-1))&&(a[i]&(1ll<<d)))
st^=1<<i-1;
res=(res+doit(d-1,st))%mod;
for(int i=1;i<=k;i++)
{
if((s&(1<<i-1))&&(!(a[i]&(1ll<<d))))
continue;
if(!(s&(1<<i-1)))
res=(res+doit(d-1,st))%mod;
else
res=(res+doit(d-1,st^(1<<i-1)))%mod;
}
return res;
}
int calc(int s)
{
int f=1;
for(int i=1;i<=k;i++)
{
if(s&(1<<(i-1)))
{
if(!l[i])
return 0;
f=-f;a[i]=l[i]-1;
}
else
a[i]=r[i];
}
memset(dp,-1,sizeof(dp));
return (mod+f*doit(50,(1<<k)-1))%mod;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%d",&k);
for(int i=1;i<=k;i++)
scanf("%lld%lld",&l[i],&r[i]),l[i]--,r[i]--;
int ans=0;
for(int i=0;i<(1<<k);i++)
ans=(ans+calc(i))%mod;
printf("%d\n",ans);
}
return 0;
}
来源:zr