1. 程式人生 > >容斥原理詳解 以及程式碼的剖析 結合例項hdu4135

容斥原理詳解 以及程式碼的剖析 結合例項hdu4135

原理:首先考慮一個問題,1000以內6,7,8,9的倍數有多少個?答案是

1000div6+1000div7+1000div8+1000div9

-1000div(6*7)-1000div(6*8)-1000div(6*9)-1000div(7*8)-1000div(7*9)-1000div(8*9)

+1000div(6*7*8)+1000div(6*8*9)+1000div(7*8*9)

-1000div(6*7*8*9)

這是容斥原理的一個最簡單的應用,類比這道題,Step3到4其實將每個數a的不重複約數記錄了下來,有公共約數的四個數的方案要從ans中減去,多減的要加上

奇加偶減

hdu 4135

Co-prime

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 87    Accepted Submission(s): 39



Problem Description Given a number N, you are asked to count the number of integers between A and B inclusive which are relatively prime to N.
Two integers are said to be co-prime or relatively prime if they have no common positive divisors other than 1 or, equivalently, if their greatest common divisor is 1. The number 1 is relatively prime to every integer. Input The first line on input contains T (0 < T <= 100) the number of test cases, each of the next T lines contains three integers A, B, N where (1 <= A <= B <= 1015
) and (1 <=N <= 109). Output For each test case, print the number of integers between A and B inclusive which are relatively prime to N. Follow the output format below. Sample Input 2 1 10 2 3 15 5 Sample Output Case #1: 5 Case #2: 10 HintIn the first test case, the five integers in range [1,10] which are relatively prime to 2 are {1,3,5,7,9}.

題意: 求 a到b的數中與n互質的數的個數

程式碼是參考人家的

參考地址

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long 
#define maxn 70

LL prime[maxn];
LL make_ans(LL num,int m)//1到num中的所有數與m個質因子不互質的個數 注意是不互質哦
{
	LL ans=0,tmp,i,j,flag;
	for(i=1;i<(LL)(1<<m);i++)
	{ //用二進位制來1,0來表示第幾個素因子是否被用到,如m=3,三個因子是2,3,5,則i=3時二進位制是011,表示第2、3個因子被用到 
		tmp=1,flag=0;
		for(j=0;j<m;j++) 
			if(i&((LL)(1<<j)))//判斷第幾個因子目前被用到
				flag++,tmp*=prime[j];
		if(flag&1)//容斥原理,奇加偶減 
			ans+=num/tmp;
		else
			ans-=num/tmp;
	}
	return ans;
}

int main()
{
	int T,t=0,m;
	LL n,a,b,i;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%I64d%I64d%I64d",&a,&b,&n);
		m=0;
		for(i=2;i*i<=n;i++) //對n進行素因子分解 
			if(n&&n%i==0)
			{
				prime[m++]=i;
				while(n&&n%i==0)
					n/=i;
			}	
		if(n>1)
			prime[m++]=n;
		printf("Case #%d: %I64d\n",++t,(b-make_ans(b,m))-(a-1-make_ans(a-1,m)));
	}
	return 0;
}

相關推薦

原理 以及程式碼剖析 結合例項hdu4135

原理:首先考慮一個問題,1000以內6,7,8,9的倍數有多少個?答案是 1000div6+1000div7+1000div8+1000div9 -1000div(6*7)-1000div(6*8)-1000div(6*9)-1000div(7*8)-1000div(7*9

LVS原理以及部署

私有地址 命中率 least 支持 靜態 enc dns查詢 state core 一、LVS簡介 linux virtual server簡稱LVS,是章文嵩博士1998年發起的一個開源項目。官網:http://www.linuxvirtualserver.org。Int

重磅!頭部姿態估計「原理 + 實戰程式碼」來啦!

寫在前面 經過兩週的文獻和部落格閱讀,CV_Life君終於欣(dan)喜(zhan)若(xin)狂(jing)地給各位帶來head pose estimation這篇文章,因為剛剛入手這個方向,如有疏漏請各位多多包涵,並多多指教。廢話少說,先放個Demo熱熱身。 Head Pose Estimatio

噴泉碼的原理以及實現

      噴泉碼是一類基於圖的線性糾刪碼,在廣播方式的通訊系統中,傳送端對原始資訊進行編碼,得到源源不斷的編碼資訊並且傳送,只要接收端能正確接收到足夠的編碼資訊就可以譯出原始資料信源,反饋重傳的差錯摔

線索二叉樹以及程式碼實現

參照《大話資料結構》188到194頁。 一、二叉樹的線索儲存結構定義 /* 二叉樹線索儲存結構定義 Link = 0,代表指向左右孩子的指標 Thread= 1 代表指向前驅或後繼的線索*/ typedef enum{ Link, Thread} Pointe

Linux網路程式設計--epoll 模型原理以及例項

1.簡介 Linux I/O多路複用技術在比較多的TCP網路伺服器中有使用,即比較多的用到select函式。Linux 2.6核心中有提高網路I/O效能的新方法,即epoll 。 epoll是什麼?按照man手冊的說法是為處理大批量控制代碼而作了改進

【資料結構週週練】034 奇偶排序演算法原理程式碼分享

一、氣泡排序 1、奇偶排序簡介 奇偶排序演算法不是嚴蔚敏老師書上的演算法,是今年某高校考研的一道考試題,聽朋友說了之後感覺很不錯,給大家分享一下。 題目大致含義如下: 已知奇偶交換排序如下所述: 1.第一趟對序列中所有奇數項i掃描,將a[i]和a[i+1]進行比較; 2.第二趟

【資料結構週週練】029 判斷無向圖是否為一棵樹演算法原理程式碼分享

一、題目 設計一個演算法,判斷一個圖G是否為一棵樹,如果是,返回TRUE,否則,返回FALSE。 二、美麗的星座 星座真的好美好美。特別是當人類給它們賦予含義的那一刻,更美,彷彿有了靈魂一般。  是不是很美,是不是?你以為我是讓你過來看星星的嗎?你以為我是

PCA 降維演算法 以及程式碼示例

%% Initialization clear ; close all; clc fprintf('this code will load 12 images and do PCA for each face.\n'); fprintf('10 images are used to train PCA an

KMP演算法 以及程式碼實現

KMP演算法求解什麼型別問題 字串匹配。給你兩個字串,尋找其中一個字串是否包含另一個字串,如果包含,返回包含的起始位置。 如下面兩個字串: char *str = "bacbababadababacambabacaddababacasdsd"; char *ptr = "

ASM原理以及使用,附程式碼

一、什麼是ASM   ASM是一個java位元組碼操縱框架,它能被用來動態生成類或者增強既有類的功能。ASM 可以直接產生二進位制 class 檔案,也可以在類被載入入 Java 虛擬機器之前動態改變類行為。Java class 被儲存在嚴格格式定義的 .class檔案裡

HDU 2204 原理(過程

Ignatius 喜歡收集蝴蝶標本和郵票,但是Eddy的愛好很特別,他對數字比較感興趣,他曾經一度沉迷於素數,而現在他對於一些新的特殊數比較有興趣。  這些特殊數是這樣的:這些數都能表示成M^K,M和K是正整數且K>1。   正當他再度沉迷的時候,他發現不知道什麼時

logging模組以及常見程式碼

1.在django中獲取客戶端IP地址: if 'HTTP_X_FORWARDED_FOR' in request.META: ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR']

B-樹、B+樹以及B*樹的原理

B-樹 B-樹是一種多路搜尋樹(並不一定是二叉的) 1970年,R.Bayer和E.mccreight提出了一種適用於外查詢的樹,它是一種平衡的多叉樹,稱為B樹(或B-樹、B_樹)。 一棵m階B樹(balanced tree of order m)是一棵平衡的m路搜尋樹。它或者是空樹

轉 深入解析:一主多備DG環境,failover的實現過程 以及 11g 災庫可以線上新增tempfile.

https://yq.aliyun.com/articles/229600   核心,就是11g通過datafille_scn 號來追日誌,而不是日誌序列號來追日誌。   摘要: 在DG中,switchover和failover是兩個重要的概念,也是DG實現的核心。根據不

自然語言處理——BLEU以及簡單的程式碼實現

引子 何為BLEU 最初的BLEU 改良型BLEU(n-gram) 短譯句的懲罰因子 總結 附錄(原始碼)

設計模式(建立型):Java常用23種設計模式之單例模式以及Java程式碼實現

可以說單例模式是所有設計模式中最簡單的一種。 單例模式就是說系統中對於某類的只能有一個物件,不可能出來第二個。 單例模式也是23中設計模式中在面試時少數幾個會要求寫程式碼的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。 1.多執行緒安全單例模式例項一(不使用同步鎖)

Hadoop MapReduce八大步驟以及Yarn工作原理

Hadoop是市面上使用最多的大資料分散式檔案儲存系統和分散式處理系統, 其中分為兩大塊分別是hdfs和MapReduce, hdfs是分散式檔案儲存系統, 借鑑了Google的GFS論文. MapReduce是分散式計算處理系統, 借鑑了Google的MapR

交換機路由器作用以及工作原理

1.1 PC機之間訪問過程 A訪問B過程 通過資料(mac地址)進行訪問 1)A傳送request請求包,該包攜帶源macA和目標macB 2)request請求包經過中繼器進行(廣播),所有的都可以收到該包 3)B收到A的請求包後,B給A回覆一個包(因為通訊是雙向的)

STL原始碼剖析---紅黑樹原理

                轉載請標明出處,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7760584      演算法導論書上給出的紅黑樹的性質如下,跟STL原始碼剖析書上面的4條性質大同小異。      1、每個結點或是紅色的,或是黑色的