HDU 4135 Co prime 容斥原理

2021-10-01 15:02:20 字數 1125 閱讀 3201

題目大意:給出乙個區間[l,r],再給出乙個n,問區間中有多少個數與n互質

題目分析:容斥原理應用的經典題目,馬克一篇非常不錯的部落格,留著以後慢慢消化:

那麼這個題目轉換一下,先求1~m中有多少個與n互質的數,這樣cal(r)-cal(l-1)就是答案了

舉個很簡單的例子應該就能懂了:

若要求1~8中有多少個與12互質的數,正難則反,我們先求一下1~8中有多少個與12不互質的數,最後用區間中的總數減去不互質的數就是答案了,那麼首先將12進行唯一分解,分解得到了兩個質因子分別是2和3,那麼在區間中與12不互斥的數一定能被2或3整除才行,也就是說現在需要求8中有多少個數能被2和3整除,能被2整除的數有8/2=4個,同理能被3整除的數有8/3=2個,但答案真的是2+4=6個嗎?我們列舉出來數一下,發現符合我們需要的數只有2,3,4,6,8五個數,算出來的答案是因為將6重複計算了兩次,所以我們需要利用容斥原理減去重複的,也就是8/(2*3)=1個,得到的答案為5,這個答案是1~8中與12不互質的數,所以最終答案就是8-5=3了

根據上面乙個簡單的例子,我們可以將容斥原理推廣一下,對於每個集合,我們可以奇加偶減,因為對於乙個小於1e9的數,唯一分解後的素因子不超過10個,故我們可以用乙個2^k的演算法列舉子集,dfs或狀壓都可以,計算出與n不互質的答案後,最終用m減去這個答案就能得到最終答案了

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=210;

vecto***ct;

ll solve(ll n,ll m)

} if(n>1)

fact.push_back(n);

ll ans=0;

for(int i=1;i<(1<>w;

int kase=0;

while(w--)

return 0;

}

hdu4135 co prime 容斥原理

題意 給定a b c,求a到b區間內與c互質的數。思路 求a到b之間的與c互素的數,等價於求1到b之間與c互素的數減去1到a之間與c互素的數。求 中與 互質的數的個數都是用尤拉函式,但如果 比較大或者是求 中與 互質的數的個數等等問題,要想時間效率高的話還是先對n分解質因數然後用容斥原理,這裡可以用...

hdu 4135 Co prime 容斥原理

題目 大意 求區間 a,b 內與n互質的數的個數。分析 單純來逐個判斷互質統計結果肯定會超時,那麼可以對n素因子分解,以素因子的個數作為迴圈的上界 第二層迴圈 第一層是列舉素因子,運用容斥原理來統計不互質的個數,最後再用總數減去不互質的個數就是互質的個數。容斥原理也就是提供了這樣間接求解的思想 先不...

hdu4135Co prime 容斥原理

題意 給定a b c,求a到b區間內與c互質的數。分析 我們可以先轉化下 用 1,b 區間與n互質的數的個數減去 1,a 1 區間與n互質的數的個數,那麼現在就轉化成求 1,m 區間於n 互質的數的個數,如果要求的是 1,n 區間與n互質的數的個數的話,我們直接求出n的尤拉函式值即可,可是這裡是行不...