HDU3388 Coprime(二分 容斥)

2021-10-02 07:53:30 字數 1451 閱讀 1237

題意

給你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

#include

#include

#include

#include

#include

using

namespace std;

#define read(x) scanf("%d", &x)

#define read(x, y) scanf("%d%d", &x, &y)

#define gc(x) scanf(" %c", &x);

#define mmt(x, y) memset(x, y, sizeof x)

#define write(x) printf("%d\n", x)

#define inf 0x3f3f3f3f

#define ll long long

#define mod 998244353

const ll n =

1e5+5;

ll prime[n]

;int idx =0;

ll ok

(ll n)}if

(cnt &

1) ans +

= n / p;

else ans -

= n / p;

}return n - ans;

}int

main()

}if(m >1)

prime[

++idx]

= m;

for(ll i =

2; i * i <= n;

++i)}if

(n >1)

prime[

++idx]

= n;

ll l =

1, r =

1e14

;sort

(prime +

1, prime + idx +1)

;int p =

unique

(prime +

1, prime + idx +1)

- prime -1;

idx = p;

while

(l < r)

//二分答案

printf

("case %d: %lld\n"

,case,r);}

}

hdu3388Coprime 二分 容斥原理

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

HDU3388 二分 容斥原理

題目 coprime 題意 給三個數m,n,k,0 思路 二分 容斥原理 由於所找的數與m,n互質,那麼這個數不能含有m,n所包含的素因子。但是k很大,不可能乙個乙個生成。於是二分,找到最小 的x,使得小於或等於x的數中滿足條件的 數的個數大於或等於k,則這個最小值即為答案。在判斷小於或等於x的數中...

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 與區間大小無...