類最大hdu 1792 A New Change Problem

weixin_33777877發表於2013-05-06

上班之餘抽點時間出來寫寫博文,希望對新接觸的朋友有幫助。今天在這裡和大家一起學習一下類最大

    題意:給定A和B,A和B互質,求最大不能組合數,和不能組合數的個數。

基礎知識:
Gcd(A, B) = 1 → Lcm(A, B) = AB
殘餘類,把所數有整劃分紅m個等價類,個每等價類由互相同餘的數整構成

任何數分紅m個殘餘類,分離為 mk,mk+1,mk+2,……,mk+(m-1)
分離記為{0(mod m)},{1(mod m)}……
而n的倍數定肯布分在這m個殘餘類中
因為Gcd(m,n)=1,所以個每殘餘類中都有一些數是n的倍數,並且是平均分配它的幹證,可見HDOJ 1222 Wolf and Rabbit
設 kmin = min{ k | nk ∈ {i (mod m)} }, i ∈ [0, m)
則 nkmin 是{i (mod m)}中n的最小倍數。特殊的,nm ∈ {0 (mod m)}
nkmin 是個志標,它明表{i (mod m)}中nkmin 面後所數有,即nkmin + jm必定都能被組合出來
那也說明最大不能組合數必定小於nkmin
我們開始尋覓max{ nkmin }
Lcm(m, n) = mn,所以很明顯(m-1)n是最大的
因為(m-1)n是nkmin 中的最大值,所以在剩下的m-1個殘餘類中,必定有比它小並且能被m和n組合,這些數就是(m-1)n -1,(m-1)n -2,……,(m-1)n -(m-1)
所以最大不能被組合數就是(m-1)n -m

如果m和n不互素,那{1 (mod m)}不能被m組合,一樣也不能被n和m組合

我們能求出各個殘餘類的nkmin以後,不能組合數的個數就是個每殘餘類中小於各自nkmin的數的個數總和。
察觀如下:
M = 5,N = 3
{0(mod 5)}:0,5,10,15……
{1(mod 5)}:16,11,16……
{2(mod 5)}:2,712,17……
{3(mod 5)}:3,8,13,18……
{4(mod 5)}:49,14,19……
色紅的就是不能組合數,可以看出在殘餘類中它的數目有律規
Total = [0+1+2] + [0+1]
因為m和n互質,必有一個不完全週期
整頓後以,可得公式 Total = (n-1)*(m-1)/2

    每日一道理
生活中受傷難免,失敗跌倒並不可怕,可怕的是因此而一蹶不振,失去了對人生的追求與遠大的理想。沒有一個人的前進道路是平平穩穩的,就算是河中穿梭航行的船隻也難免顛簸,生活中所遇上的坎坷磨難不是偶爾給予的為難,而是必然所經受的磨練。

     

     

     

     

     

     

#include<stdio.h>
int main()
{
	int i,j,n,m;
	while(scanf("%d%d",&n,&m)!=-1)
	{
		i=n*m-n-m;
		j=(m-1)*(n-1)/2;
		printf("%d %d\n",i,j);
	}
	return 0;
}

    
 

文章結束給大家分享下程式設計師的一些笑話語錄: 雅虎最擅長的不是開通新業務,是關閉舊業務。

相關文章