1. 程式人生 > >組合數學-容斥原理

組合數學-容斥原理

題意:求gcd(x,y)==k個數,其中x屬於[1,b],y屬於[1,d],其中x=5,y=7與x=7,y=5,是一樣的。

思路:求x在[1,b],y在[1,d],gcd(x,y)=k的個數

           就是求x在[1,b/k],y在[1,d/k],gcd(x,y)==1的個數

不妨設b<d;i在[1,b/k]時,與其互素的數的個數就是尤拉函式,所以在[1,b/k]為phi[i]+phi[i1]+···

當i在[b/k+1,d/k]內求區間[1,b/k]內與其互素的數的個數,先求出該區間內與他不互素的數的個數即i的素因子的組合,利用容斥原理求解找出[1,b/k]中可以被i的每個質因子整除的數的個數求和,減去可以被其任意兩個質因子整除的數的個數,加上可以被其任意三個質因子整除的數的個數。。。。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<iomanip>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1000005;
int prim[maxn+5];
ll f[maxn+5];
ll phi[maxn+5];
void init()
{
    for(int i=1;i<maxn;i++)
        phi[i]=i;
    for(int i=2;i<maxn;i+=2)
        phi[i]>>=1;
    for(int i=3;i<maxn;i+=2)
    {
        if(phi[i]==i)
        {
            for(int j=i;j<maxn;j+=i)
                phi[j]=phi[j]-phi[j]/i;
        }
    }
    //遞推法求尤拉函式
    f[1]=1;
    for(int i=2;i<maxn;i++)
        f[i]=f[i-1]+phi[i];
}
ll solve(int n,int r)
{
    int num=0;
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            prim[num++]=i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n>1)
        prim[num++]=n;
    //對n分解素因子,num是n的素因子的個數
    ll sum=0;
    for(int msk=1;msk<(1<<num);msk++)
    {//(1<<sum)是一個長為num的二進位制,msk通過從1到(1<<num)迴圈可以列舉這個二進位制的每一種排列情況
        ll mult=1;
        int bits=0;
        for(int i=0;i<num;i++)
        {
            if((1<<i)&msk)//表示的是msk二進位制的第i位為1
            {
                bits++;
                mult*=prim[i];
            }
        }
        ll cur=r/mult;
        if(bits&1)
            sum+=cur;
        else
            sum-=cur;
    }
    return r-sum;
}
int main()
{
    int t,a,b,c,d,i,k,ca;
    ll sum;
    scanf("%d",&t);
    ca=0;
    init();
    while(t--)
    {
        scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
        if(k==0)
        {
            printf("Case %d: %d\n",++ca,0);
            continue;
        }
        if(b>d)
            swap(b,d);
        b/=k;
        d/=k;
        sum=0;
        sum+=f[b];
        for(i=b+1;i<=d;i++)
            sum+=solve(i,b);
        printf("Case %d: %lld\n",++ca,sum);
    }
}

相關推薦

組合數學 原理】ICPC2014西安 F. Color

https://vjudge.net/contest/265252#problem/F 給你n朵花,m種顏色,k  (1 ≤ n, m ≤ 10^9 , 1 ≤ k ≤ 10^6 , k ≤ n, m) 花是一排,要求相鄰花染色不能相同,染色數量剛好等於k,問你染色的方案數 如

BZOJ4767 兩雙手(組合數學+原理

  因為保證了兩向量不共線,平面內任何一個向量都被這兩個向量唯一表示。問題變為一張有障礙點的網格圖由左上走到右下的方案數。   到達終點所需步數顯然是平方級別的,沒法直接遞推。注意到障礙點數量很少,那麼考慮容斥,即用總方案數減去經過障礙點的方案數。對每個障礙點計算其作為第一個經過的障礙點的方案數即可。

組合數學 原理 學習筆記 (福利向)和Leo一起做愛數學的好孩子(未完待續

演算法競賽考得很多的部分啊 這個還是很重要的 在目前的演算法競賽中有三大計數考點 1)組合計數 2)線性計數 3)群論計數 其中群論計數比較困難,我又不知道什麼是線性計數,所以只能頹組合計數。 首先是最簡單的東西 加法原理 若完成一件事的方法有nnn類,其中第i

錯排問題 組合數學+原理

3.錯排問題(problem) 【題目描述】 n本不同的書放在書架上。其中m本書已經重新擺放好,將剩下的n-m 本書也重新擺放,使每本書都不在原來放的位置。 求有幾種擺法。 【輸入資料】 第1行兩個數

組合數學——原理和錯位排列

真的,學了組合數學你會克服公式恐懼症0.0深有體會…… 容斥原理 設A1,A2,…,An為有限集合,用|Ai|表示集合Ai中的元素個數那麼有這樣的結論: |A1∪A2∪…∪An|=∑i=1n|Ai|−∑1≤i<j≤n|Ai∩Aj|+∑1≤i<

組合數學-原理

題意:求gcd(x,y)==k個數,其中x屬於[1,b],y屬於[1,d],其中x=5,y=7與x=7,y=5,是一樣的。 思路:求x在[1,b],y在[1,d],gcd(x,y)=k的個數            就是求x在[1,b/k],y在[1,d/k],gcd(x,

bzoj 4710(組合數學+原理

傳送門 題解: 先介紹一條公式:將n個物品分給m個人有C(n+m-1,m-1)種方案。但是這些方案是包括了不合法的(有些人沒有獲得任何物品)。對於這道題,需要保證所有人都分到物品,所以容斥原理解決:

UVa 11481 Arrange the Numbers (組合數學+原理)

UVa 11481 Arrange the Numbers 題目大意: 可以將序列1,2,3,...n任意重排,但重排後的前m(m≤n)個位置恰好有k(k≤m)個不變,求方案數除以1000000

組合數學-原理-求指定區間內與n互素的數的個數

求指定區間內與n互素的數的個數 給出整數n和r。求區間[1,r]中與n互素的數的個數。 去解決它的逆問題,求不與n互素的數的個數。 考慮n的所有素因子pi(i=1···k) 在[1,r]中有多少數能被pi整除呢?它就是   然而,如果我們單純將所有結果,會得到錯誤答案。有些

【專題】計數問題(排列組合原理,卡特蘭數)

spl 狀態 ans 補集 方便 常用 括號 inf 不存在 ---下面都是學習的筆記,還沒有整理,比較淩亂,有需自取吧。--- 【排列組合】 <加法原理>做一件事情有n個方法,第i個方法有pi種方案,則一共有p1+p2+...+pn種方案。 <乘法原理&

UVA 11806 組合數學+

rac pen NPU set auto cas clip .org one UVA: https://vjudge.net/problem/UVA-11806 題意:給你一個n×mn×m的矩陣網格和kk個人,問有多少種方法使得每一個格子只放一個人,並且第一行,最後一行,第

CF451E Devu and Flowers (組合數學+)

題目大意:給你$n$個箱子,每個箱子裡有$a_{i}$個花,你最多取$s$個花,求所有取花的方案,$n<=20$,$s<=1e14$,$a_{i}<=1e12$ 容斥入門題目 把取花想象成往箱子裡放花,不能超過箱子上限 $n$很小,考慮狀壓 如果去掉$a_{i}$的限制,我們取物品的

[CQOI2014]數三角形 題解(組合數學+)

[CQOI2014]數三角形 題解(數論+容斥) 標籤:題解 閱讀體驗:https://zybuluo.com/Junlier/note/1328780 連結題目地址:洛谷P3166 BZOJ 3505 思想還是很巧妙的。。。(對於我這種菜雞) 理解題意 首先它說\(n×m\)的網格,實際上是有\((

BZOJ4710: [Jsoi2011]分特產【組合數學+

Description JYY 帶隊參加了若干場ACM/ICPC 比賽,帶回了許多土特產,要分給實驗室的同學們。 JYY 想知道,把這些特產分給N 個同學,一共有多少種不同的分法?當然,JYY 不希望任 何一個同學因為沒有拿到特產而感到失落,所以每個同學都必須至少分得一個特產。 例如,JYY 帶來了2

bzoj 4517: [Sdoi2016]排列計數【原理+組合數學

沒有 原理 getchar() display del d+ getchar esp const 第一個一眼就A的容斥題! 這個顯然是容斥的經典問題------錯排,首先考慮沒有固定的情況,設\( D_n \)為\( n \)個數字的錯排方案數。 \[ D_n=n!-\su

Codeforces 451 E. Devu and Flowers(組合數學,數論,原理

傳送門 解題思路: 假如只有 s 束花束並且不考慮 f ,那麼根據隔板法的可重複的情況時,這裡的答案就是 假如說只有一個 f 受到限制,其不合法時一定是取了超過 f 的花束 那麼根據組合數,我們仍然可以算出其不合法的解共有: 最後,由於根據容斥,減兩遍的東西要加回來,那麼含有偶數個 f 的項

BZOJ4710 JSOI2011分特產(原理+組合數學

  顯然可以容斥去掉每人都不為空的限制。每種物品分配方式獨立,各自算一個可重組合乘起來即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include&

BZOJ4559 JLOI2016成績比較(原理+組合數學+斯特林數)

  容斥一發改為計算至少碾壓k人的情況數量,這樣對於每門課就可以分開考慮再相乘了。剩下的問題是給出某人的排名和分數的值域,求方案數。枚舉出現了幾種不同的分數,再列舉被給出的人的分數排第幾,算一個類似斯特林數的東西即可。後一部分與碾壓幾人是無關的,預處理一下,複雜度即為三方。當然和四方跑得也差不多快。   資

[BZOJ4710][Jsoi2011]分特產(原理+組合數學

題目描述 傳送門 題解 這道題的限制其實挺不明顯的,應該是“每個人都至少有一個” 也就是說對於所有的物品,將其劃分成n部分,每部分不能為空,問總的方案數 可以如果利用插板法的話,把n個相同的小

組合數學原理及其應用

容斥原理 例題:從1到1000中不能被5,6,8整除的整數個數。 令P1具有被5整除的性質,P2具有被6整除的性質,P3被8整除性質。 S是前1000個正整數的集合希望求出三個性質同時不滿足的個數 |A1| = floor(1000/5) = 200;|A2| =