電燈泡 (容斥原理)

2021-08-30 08:25:48 字數 1123 閱讀 1849

problem description

v_dragon有n棧電燈泡,編號為1-n,每個燈泡都有乙個開關。那麼問題來了

1.所有燈泡初始時為不亮的

2.v_dragon分別進行三次操作

3.每次操作他都選乙個質數x,將編號為x和x的整數倍的燈泡的開關都撥動一下(如果燈為亮,那麼撥動以後燈為不亮,如果燈不亮,撥動以後變為亮)

求最後亮著的燈的數量

input

輸入t表示t組測試資料(1<=t<=100)

接下來t組測試資料

每組第一行乙個n表示燈泡個數(1<=n<=10^9)

第二行三個數a,b,c表示v_dragon每次選擇的數(1<=a,b,c<=10^6)(a,b,c全為質數且a,b,c兩兩互不相等)

output

陣列最後亮著的燈的個數

sampleinput130

2 3 5

sampleoutput

15這個題是昨天晚上在b站上看容斥演算法時給出的一道題,當時也沒想明白,事後自己想了想。這其實就是三個集合容斥的簡單變形。。題目最終要求的是求還有多少燈開著,但是如果按著原來的方法做,肯定是不行的。那樣只是求得個數,但是和燈亮的個數是不同的。

原來的方法:a+b+c-ab-ac-bc+abc。這樣的話a+b+c代表的是啊a,b,c總的要摁的燈的按鈕。而ab,bc,ac代表的是這兩個數的倍數,就是兩次摁同乙個燈。這裡我們應該想一下,如果只是減乙個的話,那麼還是和原來一樣,交接的地方還是有剩餘的。。但是對乙個燈操作兩次,燈就關了。這樣就不需要計算這一塊了。所以應該減兩次。再看+abc。我們將在前面已經-2*(ab+bc+ac)了,就相當於將abc這一塊減了三次,但是對於abc這一塊,三次操作還是亮著的。所以應該加上4*(abc)。所以最後的公式應該是a+b+c-2ab-2bc-2ac+4abc.

**如下:

#include#include#include#include#include#define ll long long

using namespace std;

ll n;

ll a,b,c;

int main()

}

第一次接觸容斥原理,挺難的,不太好理解,還需要努力呀。

努力加油a啊,(o)/~

ZJNU 1262電燈泡(三分題)

description 小明的房間布置十分簡單,只有乙個節能燈泡,非常的明亮。每天晚上,他總是在自己的房間裡來回踱步,想著如何能賺到更多的錢。有一天,他發現他在房間裡的影子長度也隨著他的步伐不斷變化。突然,他腦中閃過乙個念頭,影子的最大長度 包括地面和牆壁上的陰影 是多少呢?input 多組測試資料...

容斥原理 數論

兩個集合的容斥關係公式 a b a b a b a b 重合的部分 三個集合的容斥關係公式 a b c a b c a b b c c a a b c 最後可以推廣到n個集合,集合裡的元素為奇數則加,偶數減 hdu 4135 很簡單,直接求出所有的質因子,然後容斥解決 author crystal ...

容斥原理,反演

大概知道為什麼自己水平比較渣啦。一開始只會反演,然後被容斥驚豔到。然後寫了一段時間容斥,反演忘光光。所以融會貫通真的很難。多校的三道題,當時是用反演做的。事實上以前就知道容斥跟莫比烏斯函式值的關係,然後熟練掌握 然後一段時間沒用就忘了哈。簡單來說就是,求乙個數和乙個集合中的數互質的個數,把集合中乙個...