hdu4135Co prime 容斥原理

2021-07-16 14:08:34 字數 885 閱讀 9655

題意:給定a、b、c,求a到b區間內與c互質的數。

分析:我們可以先轉化下:用(1,b)區間與n互質的數的個數減去(1,a-1)區間與n互質的數的個數,那麼現在就轉化成求(1,m)區間於n

互質的數的個數,如果要求的是(1,n)區間與n互質的數的個數的話,我們直接求出n的尤拉函式值即可,可是這裡是行不通的!我們不妨

換一種思路:就是求出(1,m)區間與n不互質的數的個數,假設為num,那麼我們的答案就是:m-num!

舉一組例項吧:假設m=12,n=30.

第一步:求出n的質因子:2,3,5;

第二步:(1,m)中是n的因子的倍數當然就不互質了(2,4,6,8,10)->n/2  6個,(3,6,9,12)->n/3  4個,(5,10)->n/5  2個。

如果是粗心的同學就把它們全部加起來就是:6+4+2=12個了,那你就大錯特錯了,裡面明顯出現了重複的,我們現在要處理的就是如何去掉那些重複的了!

第三步:這裡就需要用到容斥原理了,公式就是:n/2+n/3+n/5-n/(2*3)-n/(2*5)-n/(3*5)+n/(2*3*5).

第四步:我們該如何實現呢?我在網上看到有幾種實現方法:dfs(深搜),佇列陣列,位運算三種方法都可以!上述公式有乙個特點:n除以奇數個數相乘的

時候是加,n除以偶數個數相乘的時候是減。我這裡就寫下用佇列陣列如何實現吧:我們可以把第乙個元素設為-1然後具體看**如何實現吧!

#includeint j,a[1000];

void init(int n)

}if(n>1) a[j++]=n;

}__int64 query(__int64 n)

{ __int64 b[10000],i,m,k,t=0,sum=0;

b[t++]=-1;

for(i=0;i

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素因子分解,以素因子的個數作為迴圈的上界 第二層迴圈 第一層是列舉素因子,運用容斥原理來統計不互質的個數,最後再用總數減去不互質的個數就是互質的個數。容斥原理也就是提供了這樣間接求解的思想 先不...

HDU 4135 Co prime 容斥原理

題目鏈結 統計在大區間 a,b 中與n互質的數的個數,其中a,b都在10的15次方級。暴力肯定不行,正難則反,思考求 a,b 中不與n互質的數的個數,那麼該數必然是n的其中乙個因子的倍數,所以首先對n的所有因子進行打表,然後根據每乙個因子求在 a,b 區間中其倍數的個數。在不同的因子進行計數的時候可...