hdu2204 容斥原理)

2021-10-03 01:46:57 字數 2651 閱讀 4074

容斥原理:

設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_}}⌋

⌊ni1​n

​⌋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

然後就是代公式進去就行.

#include

#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<}}

hdu 2204 容斥原理

感覺斷斷續續的看了好久的容斥 然後還是看不懂莫比烏斯反演 以後基本原理懂了就先上手做題吧,不然感覺還是不會還浪費時間 第一題容斥 題意 給你乙個數n 1,10 18 叫你求n內有多少個數是m k得來的。可知 m k都可以變成乙個冪數為素數的形式,所以可以列舉素數,求每個素數滿足的個數。因為存在 形如...

HDU 2204(容斥原理)

input 本題有多組測試資料,每組包含乙個整數n,1 n 1000000000000000000 10 18 output 對於每組輸入,請輸出在在1到n之間形式如m k的數的總數。每組輸出佔一行。sample input 10 361000000000000000000 sample outpu...

HDU 2204(容斥原理 數學)

2015 05 14 19 35 28 題目 每次給出乙個n n 10 18 讓你求出1 n中能表示成m k的數的個數。思路 比較明顯可以用容斥解的題目.但是要注意細節。首先,觀察 k 的最大值,2 60 10 18,所以 k 60,所以我們可以列舉一下 k 的值。對於每個 k,直接計算出最大可能的...