HDU3366Coprime 二分法 容斥原理

2021-09-10 06:19:33 字數 2025 閱讀 1939

hdu題目鏈結

求第k個與n,m都互素的正數(0 < m, n, k <= 10^9)

使用二分法查詢元素

二分0~(1ll《預處理求素數(素數篩模板 longlong)

求n,m因子:遍歷素數分別求n,m的因子(不包含1,n,m)+使用unique()去重。

ans = sum(x/奇數個因子之積)-sum(x/偶數個因子之積)

例:[1,10]中可以被2,3整除的數有 10/2+10/3-10/6

範圍是long long 凡是與long long 型別進行運算(比較,加減乘除,賦值)的都要設定為long long 變數。(1ll二分法查詢元素:判斷條件/迴圈邊界 的取等

求互素個數遍歷邊界 i*i<=n(小於等於)

尤拉素數篩

long

long prime[maxn]

, tot;

long

long check[maxn]

;void

eular()

}}

求乙個數的因子

for

(long

long i =

0;prime[i]

*prime[i]

<=m; i++)}

if(m >

1) fac[cnt1++

]= m;

用容斥原理求[1,x]中可以被幾個數整除的數的個數(狀態壓縮遍歷各種選擇)

long

longrc(

long

long x)}if

(cnt&

1) ret +

= x/tmp;

else ret -

= x/tmp;

}return ret;

}

#include

using namespace std;

#define maxn 1000005

long

long fac[maxn]

, cnt1;

long

long prime[maxn]

, tot;

long

long check[maxn]

;long

long n, m, k;

void

eular()

}}void

getfac

(long

long n,

long

long m)}if

(n >

1) fac[cnt1++

]= n;

for(

long

long i =

0;prime[i]

*prime[i]

<=m; i++)}

if(m >

1) fac[cnt1++

]= m;

sort

(fac, fac+cnt1)

;int tmp =

unique

(fac, fac+cnt1)

- fac;

cnt1 = tmp;

}//狀態壓縮所有的因子組合,[1,x]中不是互素的數有x/因子*因子,容斥原理排除重複

long

longrc(

long

long x)}if

(cnt&

1) ret +

= x/tmp;

else ret -

= x/tmp;

}return ret;

}long

longds(

)else

}return ans;

}int

main

(int argc,

char

const

*ar**)

return0;

}

HDU3388 Coprime(二分 容斥)

題意 給你n m n,mn,m,讓你找到第k kk個與n nn和m mm互素的數。思路 範圍比較大,我們可以先找出n nn和m mm的質因子,然後二分答案。每次容斥判定mid midmi d是第幾個與n nn和m mm互質的數字。include include include include inc...

hdu3388Coprime 二分 容斥原理

找第k個和n,m互質的數 由容斥原理可得 在 1,x 範圍內且與n不互質的數的個數為 對於所有的n的素數因子 和乙個素數因子不互質的個數 兩個素數因子相乘的個數 三個素數因子相乘的個數 對於x越大,在 1 x 範圍內的與n,m互質的數越多,所以存在單調性,可以用二分找到剛好有k個數和n,m互質 in...

hdu4135 Co prime 互素統計

題意 統計 l,r 中與m互素的數的個數 解法 1.求字首 1,r 中與m互素的個數 2.求反面 不互素的個數,再將m分解質因子,轉化為整除問題 a,m 1,則m至少有乙個質因子整除a。ans a 1 a2 ak ai 為 1,r 中m的第i個質因子的倍數集合 複雜度 o m logm 與區間大小無...