Huge Counting

本文分享了一段使用C++实现的复杂动态规划算法竞赛代码,该算法用于解决特定的数学问题。代码中运用了位运算、动态规划等高级编程技巧,通过对状态的巧妙表示和更新,实现了高效的问题求解。适合对算法竞赛感兴趣或准备参加相关比赛的程序员深入学习。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
#define rep(i,s,t) for(register int i=s;i<=t;++i)
#define _rep(i,s,t) for(register int i=s;i>=t;--i)
using namespace std;
const int mod=990804011;
inline void inc(int &x,int y)
{
 x+=y;
 if(x>=mod)
  x-=mod;
 if(x<0)
  x+=mod;
}
typedef long long ll;
int n,m,T,ans;
ll l[10],r[10],x[10];
int f[52][1<<10];
inline int solve(int S)
{
 rep(i,0,n-1)
  x[i]=(S>>i&1)?(l[i]-1):r[i];
 rep(i,0,n-1)
  if(x[i]<0)
   return 0;
 memset(f,0,sizeof f);
 f[51][0]=1;
 _rep(i,50,0)
 {
  rep(s,0,(1<<n)-1)
  {
   if(!f[i+1][s])
    continue;
   int t=0;
   rep(j,0,n-1)
    if(x[j]>>i&1)
     t|=(1<<j);
   inc(f[i][s|t],1ll*(__builtin_popcount(s)+1)*f[i+1][s]%mod);
   rep(j,0,n-1)
    if((t&(~s))>>j&1)
     inc(f[i][s|(t^(1<<j))],f[i+1][s]);
  }
 }
 int ans=0;
 rep(s,0,(1<<n)-1)
  inc(ans,f[0][s]);
 return ans;
}
int main()
{
 scanf("%d",&T);
 for(;T--;)
 {
  ans=0;
  scanf("%d",&n);
  rep(i,0,n-1)
   scanf("%lld%lld",l+i,r+i),--l[i],--r[i];
  rep(i,0,(1<<n)-1)
   __builtin_popcount(i)&1?inc(ans,mod-solve(i)):inc(ans,solve(i));
  printf("%d\n",ans);
 }
 return 0;
}

来源:zr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值