首页 > 其他分享 >容斥原理

容斥原理

时间:2024-06-04 15:13:50浏览次数:16  
标签:int res 容斥 cin 原理 dp mod

容斥原理的基本原理是根据集合之间的交来求集合之间的并,以下仅为容斥原理的部分相关习题

https://codeforces.com/problemset/problem/803/F

题意了然,即求出所有符合公共最小公约数为1的序列数目,那么考虑一种特殊情况:只有数字i,很明显他们的最小公约数一定是i,且对于每个位置都有选或者不选两种情况,再去掉都不选的一种,所有情况为 \(2^n - 1\),那么对于i的倍数,这里举例为:2,4,6,8 那么这样一个序列所出现的公约数分别有:2,4,6,8,共有 \(2^4 - 1\) 种情况,那么设 \(dp[i]\) 是以i为公约数的序列的个数,那么有:\(dp[i] = 2^n - 1 - \sum{dp[j]}\),\(j\mod i = 0\)
倒着推即可

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
int cnt[N];
int qpow(int a,int k){
    int res=1;
    while(k){
        if(k&1) res=res*a%mod;
        k>>=1,a=a*a%mod;
    }
    return res;
}
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int n,mx=0; cin>>n;
    for(int i=1;i<=n;i++){
        int x; cin>>x;
        cnt[x]++;
        mx=max(mx,x);
    }
    vector<int>dp(mx+1);
    for(int i=mx;i>=1;i--){
        int k=0,ans=0;
        for(int j=i;j<=mx;j+=i){
            k=(k+cnt[j])%mod,ans=(ans+dp[j])%mod;
        }
        dp[i]=(qpow(2,k)-1-ans+mod)%mod;
    }
    cout<<dp[1];
    return 0;
}

https://www.luogu.com.cn/problem/P1450
首先考虑没有数量限制的情况下,我们可以直接使用完全背包求方案数,接下来考虑某个面值使用数目不合法的情况,对于求和100 元来说,设1元面值有5个,\(dp[i]\) 表示总和i的方案数,那么 \(dp[94]\) 就表示为1不合法的方案数,因为如果只靠1元面值,无法到达求和 100 元,同理设2元面值有2个,那么1元和2元同时不合法的方案数为:\(dp[100-1*5-2*3]\),故我们需要在 \(dp[100]\) 这个方案数下减去所有不合法方案数,也就是四个面值的并集,容斥即可求出

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    vector<int>c(5);
    int n;
    for(int i=1;i<=4;i++) cin>>c[i];
    cin>>n;
    vector<int>dp(N);
    dp[0]=1;
    for(int i=1;i<=4;i++){
        for(int j=c[i];j<N;j++){
            dp[j]+=dp[j-c[i]];
        }
    }
    vector<int>d(5);
    while(n--){
        for(int i=1;i<=4;i++) cin>>d[i];
        int s; cin>>s;
        int res=dp[s];
        for(int i=1;i<(1<<4);i++){
            int cnt=s,vis=-1;
            for(int j=1;j<=4;j++){
                if(i&(1<<(j-1))){
                    cnt-=(d[j]+1)*c[j];
                    vis=-vis;
                }
            }
            if(cnt>=0) res-=vis*dp[cnt];
        }
        cout<<res<<'\n';
    }
    return 0;
}

标签:int,res,容斥,cin,原理,dp,mod
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/18230772

相关文章

  • 面试官:说说Netty对象池的实现原理?
    Netty作为一个高性能的网络通讯框架,它内置了很多恰夺天工的设计,目的都是为了将网络通讯的性能做到极致,其中「对象池技术」也是实现这一目标的重要技术。1.什么是对象池技术?对象池技术是一种重用对象以减少对象创建和销毁带来的开销的方法。在对象池中,只有第一次访问时会创建对......
  • 飞睿uwb定位tag防丢器,蓝牙智能防丢器原理,支持苹果IOS的本地防丢查找
    在当今这个快节奏的社会,人们的注意力经常被各种琐事分散,丢三落四的情况时有发生。随着科技的发展,智能防丢器应运而生,成为帮助我们解决这一烦恼的助手。今天,我们就来深入探讨一款备受瞩目的智能防丢产品——飞睿UWB定位Tag防丢器,它不仅结合了新的蓝牙技术,还拥有自己的APP,支持苹......
  • XSS攻击原理及危害,说的太详细了!(值得收藏)
    随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,在移动互联网时代,web除了传统的XSS、CSRF等安全问题之外,又时常遭遇网络劫持、非法调用HybridAPI等新型安全问题。当然,浏览器自身也在不断在进化和发展,不断引入CSP、Same-SiteCookies等新技术来增强安全......
  • python3 源码阅读-虚拟机运行原理
    原文阅读源码版本python3.8.3参考书籍<<Python源码剖析>>参考书籍<<Python学习手册第4版>>官网文档目录介绍Doc目录主要是官方文档的说明。Include:目录主要包括了Python的运行的头文件。Lib:目录主要包括了用Python实现的标准库。Modules:该目录中包含了所有用C......
  • meltdown 安全漏洞原理是怎么样的?
    Meltdown是2018年初公开的一种严重的计算机安全漏洞,影响了多种处理器,包括英特尔、ARM和某些AMD处理器。其原理基于利用现代CPU的“推测执行”(speculativeexecution)和“缓存时间差异”(cachetiming)来泄露内存数据。以下是Meltdown漏洞的工作原理:基本原理推测执行(SpeculativeE......
  • OSPF协议基本原理:
    OSPF是OpenShortestPathFirst(开放最短路径优先)RIP协议存在的问题:存在最大15跳的限制,不能适用大规模组网的需求周期性发送全部路由信息,占用大量的带宽资源路由收敛速度慢以跳数作为度量值存在路由环路可能性OSPF协议特点:没有路由跳数的限制使用组播更新变化的路由和网......
  • 水文预报新安江模型原理及Matlab代码
    1 蓄满产流模型原理1.1流域蒸散发    流域蒸散发在流域水量平衡中起着重要作用。植物截流、地面填洼水量及张力土壤蓄水量的消退都耗于蒸散发,蒸散发计算成果直接影响模型产流计算成果。    在新安江模型中,流域蒸散发计算按土壤垂向分布的不均匀性将土层分......
  • 编译原理:代替LR分析法的MP分析法
    LR分析法由Knuth先生于1965年开发。LR分析法存在一个问题:当文法产生式变多,分析表变大之后,占用很多内存。为了接近自然语言编程,需要大量的文法产生式,有可能分析表过大,内存里放不下。MP分析法,是multi-pass(多遍分析法)。词法分析和语法分析仍然是分开的,语法分析按照“先乘除......
  • Web网络安全-----Log4j高危漏洞原理及修复_log4j漏洞是什么
    系列文章目录文章目录系列文章目录什么是Log4j?一、Log4j漏洞二、漏洞产生原因1.什么是Lookups机制2.怎么利用JNDI进行注入JNDI简介LADPRMI三、Log4j漏洞修复总结什么是Log4j?Log4j即logforjava(java的日志),是Apache的一个开源项目,通过使用Log4j,我们可以控制日......
  • 检测DDoS攻击的原理
    检测DDoS攻击的原理分布式拒绝服务(DDoS)攻击是一种常见且破坏性极大的网络攻击方式。它通过大量的恶意流量使目标服务器或网络资源无法正常工作,从而达到瘫痪目标的目的。为了有效防御DDoS攻击,检测是至关重要的一步。本文将详细探讨DDoS攻击的检测原理,帮助读者了解如何识别和......