Huge Counting

版权声明:未经过同意不得转载 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

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/83004785
今日推荐