51nod 1284 2 3 5 7的倍數問題)

2021-08-22 13:34:36 字數 1223 閱讀 8211

給出乙個數n,求1至n中,有多少個數不是2 3 5 7的倍數。 例如n = 10,只有1不是2 3 5 7的倍數。

input

輸入1個數n(1 <= n <= 10^18)。
output

輸出不是2 3 5 7的倍數的數共有多少。
input示例

10
output示例

1
解題思路:

先分別求有多少是2、3、5、7的倍數,設分別有a、b、c、d個。

然後分別求有多少是6(2和3最小公倍數)、10(2和5最小公倍數)、14(2和7最小公倍數)、

15(3和5最小公倍數)、21(3和7最小公倍數)、

35(5和7)最小公倍數的倍數,設分別有e、f、g、h、i、j個。

再分別求有多少是30(2、3、5最小公倍數)、

42(2、3、7最小公倍數)、70(2、5、7最小公倍數)、

105(3、5、7最小公倍數)的倍數,設分別有k、l、m、q個。

再求有多少是210(2、3、5、7最小公倍數)的倍數,設有o個,

最後,不是2、3、5、7的倍數的數字有:

[n-(a+b+c+d)+(e+f+g+h+i+j)-(k+l+m+q)+o]個

#include #includeusing namespace std;

long long n,num,a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,bcd,acd,abcd;

int main()

這樣寫需要定義太多變數,下面給出改進。

思路和上面思路一樣,只不過把式子綜合起來。

l令 a=n/2+n/3+n/5+n/7;

b=n/6+n/10+n/14+n/15+n/21+n/35;

c=n/30+n/42+n/70+n/105;

d=n/210;

最終結果為:

[n-(a-b+c-d)]=[n-a+b-c+d];

#includeusing namespace std;

int main()

本題應用了容斥原理。

要計算幾個集合並集的大小,我們要先將單個集合的大小計算出來,然後減去兩個集合相交的部分,再加回三個集合相交的部分,再減去四個集合相交的部分,以此類推,一直計算到所有集合相交的部分。

那麼由此,我們也可以解決n個集合求並的問題。

51 nod 最高的獎勵

有n個任務,每個任務有乙個最晚結束時間以及乙個對應的獎勵。在結束時間之前完成該任務,就可以獲得對應的獎勵。完成每乙個任務所需的時間都是1個單位時間。有時候完成所有任務是不可能的,因為時間上可能會有衝突,這需要你來取捨。求能夠獲得的最高獎勵。input 第1行 乙個數n,表示任務的數量 2 n 500...

51Nod 1241 特殊的排序

題目傳送門 分析 之前想的是求lis,後面發現這組資料會出問題 3 1 2 4 5 6。其實這裡的lis還應當滿足前後兩個元素的值相差為1。比如上面的最長子串行為 3 4 5 6,而不是1 2 4 5 6。即只需移動1 2即可。即如果n個數最長連續上公升子串行 這裡的連續指數值上連續,即前後相差1 ...

51nod 1091 線段的重疊

基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10 20 和 12 25 的重疊部分為 12 20 給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。...