天天看點

1284 2 3 5 7的倍數

1284 2 3 5 7的倍數

基準時間限制:1 秒 空間限制:131072 KB 分值: 5 難度:1級算法題

給出一個數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      

題目連結:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1284

分析:

此題是典型的容斥原理題,一開始了解錯誤,寫成了醜數題,反正一直逾時,後來才發現;

要求不是2,3,5,7的倍數的個數,可以先求出2,3,5,7的個數,之後通過n減去2,3,5,7的倍數的個數可求得不是2,3,5,7的倍數的個數;

而要知道2,3,5,7的倍數的個數,隻需要分别知道2的倍數個數,3的倍數個數,5的倍數個數,7的倍數的個數,之後通過容斥原理(先不考慮重疊的情況,把包含于某内容中的所有對象的數目先計算出來,然後再把計數時重複計算的數目排斥出去,使得計算的結果既無遺漏又無重複,這種計數的方法稱為容斥原理--簡而言之,就是對于重疊次數隻有奇數次的,我們加上,重疊次數為偶數次的,我們要減去)可得到。最後即可得到不是2 3 5 7的倍數的個數。

下面給出AC代碼:

1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     __int64 n;
 6     while(scanf("%I64d",&n)!=EOF)
 7     {
 8         __int64 a=n/2;
 9         __int64 b=n/3;
10         __int64 c=n/5;
11         __int64 d=n/7;
12         __int64 ab=n/6;
13         __int64 ac=n/10;
14         __int64 ad=n/14;
15         __int64 bc=n/15;
16         __int64 bd=n/21;
17         __int64 cd=n/35;
18         __int64 abc=n/30;
19         __int64 abd=n/42;
20         __int64 acd=n/70;
21         __int64 bcd=n/105;
22         __int64 abcd=n/210;
23         __int64 ans=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+acd+bcd-abcd;
24         printf("%I64d\n",n-ans);
25     }
26     return 0;
27 }      

作  者:Angel_Kitty

出  處:https://www.cnblogs.com/ECJTUACM-873284962/

關于作者:阿裡雲ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有問題或建議,請多多賜教!

版權聲明:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。

特此聲明:所有評論和私信都會在第一時間回複。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我

聲援部落客:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!

歡迎大家關注我的微信公衆号IT老實人(IThonest),如果您覺得文章對您有很大的幫助,您可以考慮賞部落客一杯咖啡以資鼓勵,您的肯定将是我最大的動力。thx.

1284 2 3 5 7的倍數

我的公衆号是IT老實人(IThonest),一個有故事的公衆号,歡迎大家來這裡讨論,共同進步,不斷學習才能不斷進步。掃下面的二維碼或者收藏下面的二維碼關注吧(長按下面的二維碼圖檔、并選擇識别圖中的二維碼),個人QQ和微信的二維碼也已給出,掃描下面👇的二維碼一起來讨論吧!!!

1284 2 3 5 7的倍數

歡迎大家關注我的Github,一些文章的備份和平常做的一些項目會存放在這裡。