2018宁夏邀请赛K题Vertex Covers(高维前缀和 状压 折半

https://vjudge.net/problem/Gym-102222K

题意:给定N点M边的无向图,每个点有点权。  点覆盖表示某个点集S{}覆盖了所有的边,其贡献是S中点权之积。 现在让你求所有满足条件的点集贡献之和。N<36,保证无重边,自环。

思路:点覆盖选谁不选谁肯定状压,N有36再来个折半,然后想办法合并两边。可以枚举左边那堆点的状态,对于左边没选中的那些点,若他连接的其他左边点都被选中了(否则该状态舍去),

求出他连接的右边那些点,即是右边的必选点,那么右边就可以选该必选点集或其超集,先把右边每个状态预处理即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=2000010;
int a[maxn],sum[maxn],ltl[40],ltr[40],rtr[40],Mod;
void MOD(int &x){ if(x>=Mod) x-=Mod;}

int main(){
    int T,N,M,u,v,C=0;
    cin>>T;
    while(T--){
        cin>>N>>M>>Mod;
        rep(i,0,N-1) cin>>a[i];
        rep(i,0,N-1) ltl[i]=ltr[i]=rtr[i]=0;
        int L=(N+1)/2,R=N-L,ans=0;
        rep(i,1,M){
            cin>>u>>v;
            u--,v--;
            if(u>v) swap(u,v);
            if(u<L){
                if(v<L) ltl[u] |= (1<<v);
                else ltr[u] |= (1<<(v-L));
            }
            else rtr[u] |= (1<<(v-L));
        }
        rep(i,0,(1<<R)-1){
            int res = 1;
            rep(j,0,R-1){
                if(i&(1<<j)) res = 1LL*res*a[j+L]%Mod;
                else{
                    res = res*((rtr[j+L]|i)==i);
                    if(!res) break;
                }
            }
            sum[i] = res;
        }
        rep(i,0,R-1){
            rep(j,0,(1<<R)-1){
                if(!(j&(1<<i))) MOD(sum[j]+=sum[j|(1<<i)]);
            }
        }
        rep(i,0,(1<<L)-1){
            int res=1,need=0;
            rep(j,0,L-1){
                if(i&(1<<j)) res = 1LL*res*a[j]%Mod;
                else{
                    res = res*((ltl[j]|i)==i),need|=ltr[j];
                    if(!res) break;
                }
            }
            MOD(ans+=1LL*res*sum[need]%Mod);
        }
        printf("Case #%d: %d\n",++C,ans);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/wzgg/p/11457453.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zynq系列和Vertex系列是Xilinx的两个不同系列的FPGA产品。Zynq系列是Xilinx的SOC系列,将FPGA和处理器单元以及常见处理器外设封装在一起,旨在以单芯片解决整个控制部分的设计。比较常见的Zynq-7000系列具有较低的成本、较高的灵活性,因此在许多工业场合得到广泛应用。Zynq系列的产品通常包含ARM Cortex-A9或Cortex-A53处理器核心。 而Vertex系列是Xilinx的FPGA系列,是纯逻辑产品。Vertex系列包括Spartan、Artix、Kintex和Vertex系列的产品。这些产品具有不同的逻辑规模、速度等级和制程。Vertex系列的产品通常用于需要高性能和高可靠性的应用,如通信、图像处理和数据中心等领域。 因此,Zynq系列和Vertex系列的主要区别在于Zynq系列是SOC系列,将FPGA和处理器单元封装在一起,而Vertex系列是纯逻辑的FPGA产品。 #### 引用[.reference_title] - *1* *3* [ZYNQ UltraScale+ MPSoc FPGA初学笔记](https://blog.csdn.net/weixin_39638708/article/details/111537170)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [270-FPGA V7卡学习资料:VC709E 增强版 基于FMC接口的Xilinx Vertex-7 FPGA V7 XC7VX690T PCIeX8 接口卡](https://blog.csdn.net/hexiaoyan827/article/details/104041669)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值