1. 程式人生 > >POJ 2773 容斥原理

POJ 2773 容斥原理

for log cto tor ans 個數 ret num void

鏈接:

http://www.cnblogs.com/MashiroSky/p/5913989.html

題意:

給出兩個數m,k,要求求出從1開始與m互質的第k個數。

題解:

二分一個答案mid,容斥統計出在區間[1,mid]中是m的質因子的倍數的數的個數ans,然後我們可以用mid-ans得到區間中有多少個與m互質的數,不斷二分下去,直到得出答案。

代碼:

31 ll n, k;
32 ll factor[MAXN], sz;
33 ll sum, mid;
34 
35 void prime_factor(ll n) {
36     sz = 0;
37     for
(ll i = 2; i*i <= n; i++) if (n%i == 0) { 38 factor[sz++] = i; 39 while (n%i == 0) n /= i; 40 } 41 if (n > 1) factor[sz++] = n; 42 } 43 44 void dfs(ll id, ll step, ll num) { 45 if (id == sz) { 46 if (step != 0) { 47 if (step & 1) sum += mid / num;
48 else sum -= mid / num; 49 } 50 return; 51 } 52 dfs(id + 1, step, num); 53 if (num*factor[id] <= mid) 54 dfs(id + 1, step + 1, num*factor[id]); 55 } 56 57 int main() { 58 while (cin >> n >> k) { 59 prime_factor(n);
60 ll l = k, r = 1e18, ans = l; 61 while (l <= r) { 62 mid = (l + r) / 2; 63 sum = 0; 64 dfs(0, 0, 1); 65 if (mid - sum >= k) r = mid - 1, ans = mid; 66 else l = mid + 1; 67 } 68 cout << ans << endl; 69 } 70 return 0; 71 }

POJ 2773 容斥原理