給出乙個數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示例
10output示例
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條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。...