首页 > 编程语言 >【算法专题】容斥原理

【算法专题】容斥原理

时间:2023-04-01 17:13:50浏览次数:59  
标签:专题 int res ll 容斥 long 算法 fm mod

【算法专题】容斥原理

E. Devu and Flowers

https://codeforces.com/contest/451/problem/E
前置知识:隔板法
然后正难则反,把至多取 \(a_i\) 个转化为 至少取 \(a_i+1\) 的反问题,就能套用隔板法的公式了。
答案即为:

#include <bits/stdc++.h>
#define ll long long

using namespace std;
const int N = 25, mod = 1e9 + 7;
ll c[N], n, m, sum, fm = 1;

ll qmi(ll a, ll k, ll p){
    ll res = 1;
    while(k){
        if(k & 1)    res = (ll)res * a % p;
        a = (ll)a * a % p;
        k >>= 1;
    }
    return res;
}

ll C (ll a, ll b) { //a! / (b!(a-b)!)
    if (a < b)  return 0;
    ll fz = 1;
    for (ll i = a; i > a - b; i--)     (fz *= i % mod) %= mod;
    return (fz % mod * fm) % mod;
}

int main () {
    cin >> n >> m;
    for (int i = 0; i < n; i++)    cin >> c[i];
    for (int i = 1; i < n; i++)     fm = (i * fm) % mod;
    fm = qmi (fm, mod - 2, mod);
    for (int i = 0; i < 1ll << n; i++) { //二进制枚举
        ll a = m + n - 1, b = n - 1, sign = 1;
        for (int j = 0; j < n; j++) {
            if (i >> j & 1) {
                sign *= -1;
                a -= c[j] + 1;
            }
        }
        sum = (sum + C (a, b) * sign + mod) % mod;        
    }
    cout << (sum + mod) % mod;
}

215. 破译密码

https://www.acwing.com/problem/content/217/
前置知识:莫比乌斯函数数论分块

题解:https://www.acwing.com/solution/content/17858/

#include <bits/stdc++.h>
#define ll long long

using namespace std;
const int N = 50005;
ll a, b, d, mobius[N], prime[N], sum[N];
bool vis[N];

void init (int x) { //线性筛法求mobius函数
    mobius[1] = 1;
    int cnt = 0;
    for (int i = 2; i <= x; i++) {
        if (!vis[i])    prime[++cnt] = i, mobius[i] = -1;
        for (int j = 1; i * prime[j] <= x; j++) {
            int t = i * prime[j];
            vis[t] = true;
            if (i % prime[j] == 0) {
                mobius[t] = 0;
                break;
            }
            mobius[t] = mobius[i] * -1;
        }
    }
    for (int i = 1; i <= x; i++)    sum[i] = sum[i-1] + mobius[i];
}

void solve () {
    scanf ("%lld%lld%lld", &a, &b, &d);
    a /= d, b /= d; //即求 x<=a, y<=b, (a,b)=1的个数
    ll l = 1, r, n = min (a, b), ans = 0;
    while (l <= n) {
        r = min (n, min (a / (a / l), b / (b / l)));
        ans += (a / l) * (b / l) * (sum[r] - sum[l-1]);
        l = r + 1;
    }
    printf ("%lld\n", ans);
}

int main () {
    init (N - 1);
    int t;
    scanf ("%d", &t);
    while (t--) solve ();
}

F - Tree and Constraints

https://atcoder.jp/contests/abc152/tasks/abc152_f

标签:专题,int,res,ll,容斥,long,算法,fm,mod
From: https://www.cnblogs.com/CTing/p/17278740.html

相关文章

  • 递归算法
    递归算法 递归算法是一种通过调用自身来解决问题的算法。递归算法通常涉及到将一个问题划分为较小的子问题来解决,并在子问题中调用自身来完成。递归算法的基本思想是,将一个大问题转化为一个或多个相同结构的小问题,直到问题变得足够小以便直接解决。然后将这些小问题的解组合成......
  • 算法导论-第1章-算法在计算中的作用
    第1章算法在计算中的作用1.1算法(Algorithms)非形式地说,算法(algorithm)是任何明确定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或某个值的集合作为输出。因此算法就是将输入转换为输出的一系列计算步骤。Informally,analgorithmisanywell-definedcomputa......
  • 算法导论-第2章-算法基础
    第2章算法基础2.1插入排序(Insertionsort)输入:\(n\)个数的序列\(<a_1,a_2,\cdots,a_n>\)输出:输入序列的一个排列\(<a_1^{'},a_2^{'},\cdots,a_n^{'}>\),满足\(a_1^{'}\lea_2^{'}\le\cdots\lea_n^{'}\)被排序的数称为关键字。在本书中,使用伪代码(pseudoc......
  • VBA 对象数组排序算法分享
     FunctionSrotObjectByProperty(objsToSortAsVariant,PropertyNameAsString,Optional降序AsBoolean=True)IfIsEmpty(objsToSort)ThenExitFunctionIfInStr(TypeName(objsToSort),"()")<1ThenExitFunction'IsArray()issom......
  • 【专题】2022年中国企业ESG战略与实践白皮书报告PDF合集分享(附原数据表)
    当前,随着气候变化、新冠疫情和地缘政治等重大突发事件的冲击,公司所处的宏观环境面临着越来越多的不确定性。在中国,伴随着“双碳”目标的实施和“共同富裕”的实施,我国的经济增长方式正在转向一种新的、同时也是一种生态与福利并重的增长方式。在这种情况下,ESG成为了许多公司关注的......
  • 算法笔记之并查集
    一、并查集的定义并查集是一种树型的数据结构,用于处理一些不相交集合(disjointsets)的合并及查询问题。常常在使用中以森林来表示。并查集,顾名思义,支持以下两种操作操作:并(Union):把两个不相交的集合合并为一个集合。查(Find):查询两个元素是否在同一个集合中。二、并查......
  • 基于凸集上投影(POCS)的聚类算法
    POCS:ProjectionsontoConvexSets。在数学中,凸集是指其中任意两点间的线段均在该集合内的集合。而投影则是将某个点映射到另一个空间中的某个子空间上的操作。给定一个凸集合和一个点,可以通过找到该点在该凸集合上的投影来进行操作。该投影是离该点最近的凸集内的点,可以通过最小......
  • 【LBLD】小而美的算法技巧:前缀和数组
    【LBLD】小而美的算法技巧:前缀和数组一维数组中的前缀和classNumArray{private:vector<int>preSum;public:NumArray(vector<int>&nums){preSum.push_back(0);for(inti=1;i<nums.size()+1;i++){preSum.push_back(......
  • mp雪花算法生成的id到前端丢失精度问题
    mp生成的id是Long型18位,但是js处理到16位就四舍五入了,解决办法就是在服务器转成字符串传给前端  WebMvcConfig要继承WebMvcConfigurationSupport,重写里面的extendMessageConverters方法@OverrideprotectedvoidextendMessageConverters(List<HttpMessageConv......
  • 基于matlab的高精度信号峰值检测算法
    1.算法描述       峰值检验是示波表中数据采集方式之一,这种技术起源于存储深度不能满足捕获毛刺的需要。如果用模拟示波器去观察,只有当毛刺信号是重复性的并且和主信号同步时,才能看到毛刺信号。由于毛刺源于其他电路系统,所以这些毛刺只是偶尔发生,并且和主信号......