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.

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