日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

合理抽象灵活运用排列组合(洛谷P2181题题解,Java语言描述)

發(fā)布時間:2025/3/15 java 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 合理抽象灵活运用排列组合(洛谷P2181题题解,Java语言描述) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目要求

P2181題目鏈接


分析

其實,本題是一個數(shù)學(xué)題。。。

首先由題意得,不會有三條對角線交于一點,所以過某一個交點有且只能有2條對角線。
而這兩條對角線實質(zhì)上是確定了4個頂點(也可以看做是一個四邊形的兩條對角線交于一點,求四邊形的數(shù)量),因此我們只需要確定4個頂點就得到了這個唯一確定的交點。

因此我們只需要求這樣4個頂點的組合有多少個,即從n個頂點中取4個出來的組合數(shù)。

此時,這個問題變成了排列組合問題。。。

根據(jù)組合數(shù)的公式,得:

于是我們就得到了我們解題的核心算法(公式咯): n * (n-1) * (n-2) * (n-3) / 24
但我們這么處理,由于連乘再除,要考慮溢出和精度,所以我們可以化簡。

原式可以化為:
n * (n-1) / 2 * (n-2) / 3 * (n-3) / 4

那為什么這樣一定是對的呢?難道不會因為除不盡卻向下取整而導(dǎo)致錯誤嗎?

事實上是一定除得盡的:

首先n和n-1一定有一個是2的倍數(shù),因此2可以除盡。
同理n,n-1,n-2中一定有一個是3的倍數(shù),因此3可以除盡(除掉2只會消除因數(shù)2而對3沒有影響)
再同理,4也可以除盡。

坑點

還是這個數(shù)值類型的選擇問題。。
你選int還覺得沒問題,一看很和諧,一跑就WA。。。

但換成long才能看出問題:

顯然只能用BigInteger。。。

為啥懶得用BigIntegeer呢,看我AC代碼就知道了,何等的麻煩以及慢…………能不用就別用,但是連乘可以用這個東西保命一下。。

AC代碼(Java語言描述)

import java.math.BigInteger; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);BigInteger number = scanner.nextBigInteger();scanner.close();BigInteger num1 = new BigInteger("1");BigInteger num2 = new BigInteger("2");BigInteger num3 = new BigInteger("3");BigInteger num4 = new BigInteger("4");number = number.multiply(number.subtract(num1)).divide(num2).multiply(number.subtract(num2)).divide(num3).multiply(number.subtract(num3)).divide(num4);System.out.println(number);} }

看看,這個公式,每一次都有“.”,麻煩得很。。。

總結(jié)

以上是生活随笔為你收集整理的合理抽象灵活运用排列组合(洛谷P2181题题解,Java语言描述)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。