容斥原理:
設a
ia_i
ai為集合,∣ai
∣|a_i|
∣ai
∣為集合大小
則∣ a1
∪a2∪
a3∪a
4⋯an
∣|a_1\cup a_2\cup a_3\cup a_4\cdots a_n|
∣a1∪a
2∪a
3∪a
4⋯a
n∣=∑i
=1n∣
ai∣−
∑i=1
n∑j=
i+1n
∣ai∩
aj∣+
∑i=1
n∑j=
i+1n
∑k=j
+1n∣
ai∩a
j∩ak
∣−
⋯=\sum\limits_^|a_i|-\sum\limits_^\sum\limits_^|a_i\cap a_j|+\sum\limits_^\sum\limits_^\sum\limits_^|a_i\cap a_j\cap a_k|-\cdots
=i=1∑n
∣ai
∣−i
=1∑n
j=i
+1∑n
∣ai
∩aj
∣+i
=1∑n
j=i
+1∑n
k=j
+1∑n
∣ai
∩aj
∩ak
∣−⋯=(
−1)k
+1∑1
<=i
1 < ⋯ <=n ∣ai1 ∩ai2 ∩ai3 ⋯∩ai k∣ =(-1)^\sum\limits_}}⌋ ⌊ni1n ⌋a ia_i ai代表n nn以內的數(如m mm)滿足是m mm=m im^i mi為了減少情況,我們不從1 11開始,從2 22開始,即∣ai ∣|a_i| ∣ai ∣記錄的是2⋯n 2\cdots n 2⋯n滿足的情況,因為1 11的任意次方都為1 11則交集如∣ai ∩aj∩ ak ∣|a_i\cap a_j\cap a_k| ∣ai∩a j∩a k∣=⌊nn 1lcm (i,j ,k)⌋ ⌊\frac}}⌋ ⌊nlcm( i,j, k)1 n⌋; p ow powpo w函式會有精度損失,開根後需要加一判斷是否滿足條件,不過這題水了,精度損失倒是對這沒有影響,也能ac 然後就是代公式進去就行. #define ll long long #define endl '\n' #define rep(i,l,r) for(int i=l;i<=r;i++) #define per(i,r,l) for(int i=r;i>=l;i--) const int mx= 1e5+7; const ll mod= 1e18+7 ;const double isps= 1e-8 ;int pri[mx] ,isp[mx] ;using namespace std; ll qpow (ll a,ll b,ll mod=mod) }ll inv (ll a,ll mod=mod) ll __gcm (ll a,ll b) int mp[mx] ;int g[mx] ;int top=0; void prime() for( int j= 1;j<=top&&pri[j] *i}ll ant[mx] ,n;void dfs( int tmp, int temp, int gcm, int mx,ll&sum, int q) for( int i=q;i<=mx;i++)} }int main() ll sum= sqrt (n); ll m=sum; int a=1; a++; ant[a] =sum; double ans; while (a+1 <=mx)}if (!temp) }for (int i= 2;i<=a;i++ ) cout<}} 感覺斷斷續續的看了好久的容斥 然後還是看不懂莫比烏斯反演 以後基本原理懂了就先上手做題吧,不然感覺還是不會還浪費時間 第一題容斥 題意 給你乙個數n 1,10 18 叫你求n內有多少個數是m k得來的。可知 m k都可以變成乙個冪數為素數的形式,所以可以列舉素數,求每個素數滿足的個數。因為存在 形如... input 本題有多組測試資料,每組包含乙個整數n,1 n 1000000000000000000 10 18 output 對於每組輸入,請輸出在在1到n之間形式如m k的數的總數。每組輸出佔一行。sample input 10 361000000000000000000 sample outpu... 2015 05 14 19 35 28 題目 每次給出乙個n n 10 18 讓你求出1 n中能表示成m k的數的個數。思路 比較明顯可以用容斥解的題目.但是要注意細節。首先,觀察 k 的最大值,2 60 10 18,所以 k 60,所以我們可以列舉一下 k 的值。對於每個 k,直接計算出最大可能的...#include
hdu 2204 容斥原理
HDU 2204(容斥原理)
HDU 2204(容斥原理 數學)