將N$的支票換為1$,2$,3$三種硬幣

來源:互聯網
上載者:User

Problem Description:
There are three kinds of coins:1$,2$,3$.Given a chique of N$(0<n<=10^9),calculate the number of different ways to exchange the cheque.
Sample Input:1 2 3
Sample Outpt:1 2 3

也就是說,將N$的支票換為1$,2$,3$三種硬幣,問有多少種換法?題目看似簡單,問題是,ACM-ICPC對於程式的已耗用時間是有嚴格限制的,對於輸入為10^9這麼大的數要計算出其換法有沒有很好的演算法,我當時寫的花了5秒運行出來,結果還是逾時。我不是電腦專業的學生,也沒有學過程式設計與演算法,抱著學習的心態參加此次比賽,請高手幫解,感激不盡,分數大大的有。

簡單:
long Partition(int M){
int V=M/6,i,m=M%6;
long c=3*V*V+3*V+1;
if(m==0)return c;
else return c+m*V+m-1;
}

很簡單.首先考慮M是6的倍數的情況,
那麼對於任意的y,z
2y+3z<=M我們都有一個解 x=M-2y-3z
所以我們只要數
2y+3z<=M,y>=0,z>=0的數目
而在M是6的倍數時,這個映像在平面上是一個三角形,而且三角形三個頂點都是格點
我們可以直接用格點三角形的面積來計算點的數目:
S=E/2+I-1,其中E表示邊界上格點數目,I表示內部的格點數目.(其實直接數格點數目也好數)
而E很容易數出來,這樣就可以算出I+E=3*V*V+3*V+1,(V=M/6)
然後,對於M關於6的餘數不是0,我們只要計算
2y+3z=6V+1,6V+2,6V+3,...的數目就可以了.
分別對應
2y+3z==6V+t的數目
這個在t=1時,是V個,對於t>1,是V+1個
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.