這個題的意思是給你兩個數m, k, 讓你求出與m互質的第k個數, 設想對於乙個數r,我們可以求出小於等於r與m互質的數的個數, 那麼我們就可以使用二分很快的求解。 假設我們把m唯一分解 m = p1^a1 * p2^a2 * ... * pi^ai, 那麼小於等於r與m互質的數中不應該有p1 p2 .. pi這些因子, 因此問題轉化成求解小於等於r且不含有p1, p2 p3 .. pi因子的數的個數, 這可以使用容斥原理來接覺, 假設ai是不含有因子pi的數的個數那麼答案就是 r - (a1+a2+ .. ai) + (ai並aj i!=j) - ... ai = r/pi. **如下:
#include #include#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int maxn = 100000 + 10
;int
m, k;
intpi[maxn], npi;
bool
vis[maxn];
intprime[maxn], num;
void shai(int
n)ll check(ll r)
//求解r中與m互質的數目
return
res;
}int
main()
if(tp == 1) break
; }
if(tp != 1) pi[npi++] =tp;
ll l=1, r=0x3f3f3f3f3f3f3f3f
; ll res = 1
;
while(l <=r)
else l = mid + 1
; }
cout
}return0;
}
POJ 2773 二分 容斥原理
給m k 求與m互質的第k個數 1 m 1000000 k 1 k 100000000 k比較大,對於乙個數n,1到n以內和m互質的數可以通過容斥原理很快算出來,並且隨n遞增 因此二分k就好了 include include include include include includeusing ...
POJ2773 容斥 二分
題目要求和m互質的第k大。那麼二分區間,統計區間內和m互質的數個數,所有個數為k結果最小的就是答案。k比較大最初二分的右端點開大點。include include include include include include using namespace std define maxn 1111...
poj3904 容斥原理)
可以得到這樣的關係 奇數加 偶數減 題目大意 給一串數字,求解互質四元組的個數 注意不必兩兩互質 解題思路 網上有很多 但是詳細講解的很少,這裡結合筆者的思路詳細論述一下解題思路,耐心一看。首先容易想到,想計算不互質的四元組的個數,再用總的減去,關鍵是怎樣計數不互質四元組的個數?列舉公約數,對於同乙...