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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 3505 【CQOI2014】 数三角形

發(fā)布時(shí)間:2023/12/20 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 3505 【CQOI2014】 数三角形 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

給定一個(gè)nxm的網(wǎng)格,請(qǐng)計(jì)算三點(diǎn)都在格點(diǎn)上的三角形共有多少個(gè)。

下圖為4x4的網(wǎng)格上的一個(gè)三角形。

注意三角形的三點(diǎn)不能共線。

Input

輸入一行,包含兩個(gè)空格分隔的正整數(shù)m和n。

Output

輸出一個(gè)正整數(shù),為所求三角形數(shù)量。

HINT

數(shù)據(jù)范圍
$1\leqslant m,n \leqslant 1000$

?

  這道題一眼看去有一個(gè)非常顯然的想法,那就是先用組合數(shù)算出任選三點(diǎn)出來(lái)的方案數(shù),最后再減去三點(diǎn)共線的情況即可。那么關(guān)鍵就在于如何求三點(diǎn)共線的數(shù)目。

  首先,我們要用到一個(gè)公式:設(shè)兩個(gè)整點(diǎn)分別為$(x_1,y_1)$,$(x_2,y_2)$,那么兩點(diǎn)之間連線上的整點(diǎn)數(shù)目為$gcd(|x_2-x_1|,|y_2-y_1|)$。

  我覺得這個(gè)公式需要證明一下(其實(shí)很簡(jiǎn)單)。

  首先,這條直線可以平移一下,使得$x_1=y_1=0$。為了考慮方便,我們這里還設(shè)$x_2 \geqslant 0,y_2 \geqslant 0$

  設(shè)$\Delta x=x_2,\Delta y =y_2$(只是為了好看一點(diǎn)),連線上整點(diǎn)的坐標(biāo)為$(x,y)$,那么顯然有:$$\frac{x}{\Delta x}=\frac{y}{\Delta y}$$

  設(shè)$r=gcd(\Delta x,\Delta y)$,$\Delta x=ar$,$\Delta y=br$,那么有:$$xb=ya$$

  由于$a,b$互質(zhì),$x,y$為整數(shù),于是我們就得到了$$x=ka,y=kb(k \in Z)$$;

  由于$0 \leqslant x \leqslant \Delta x,0\leqslant y \leqslant \Delta y$且$x,y$為整數(shù)

  所以$x,y$的取值共有$\Delta x / a=\Delta y/b=gcd(\Delta x,\Delta y)$種

  除去$x=\Delta x,y=\Delta y$這組解,這兩點(diǎn)連線上共有$gcd(\Delta x,\Delta y)-1$個(gè)整點(diǎn)。

  接下來(lái)我們可以直接枚舉線段,然后計(jì)算有線段上有多少個(gè)整點(diǎn);然而這樣復(fù)雜度是$O(n^2m^2)$的。

  然后,顯然每一條線段經(jīng)過平移,使它的左端點(diǎn)在矩形左下角或者左上角。由于向下和向上的線段對(duì)稱,所以只需要計(jì)算一種即可。

  所以就固定一個(gè)端點(diǎn)為$(0,0)$,枚舉另外一個(gè)端點(diǎn)在哪里,計(jì)算一下即可。

  下面貼代碼(話說這么一道題我好像講復(fù)雜了):

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)using namespace std; typedef long long llg;int n,m; llg ans,x;int gcd(int a,int b){if(!b) return a;int r=a%b;while(r) a=b,b=r,r=a%b;return b; }int main(){File("a");scanf("%d %d",&n,&m);x=(n+1)*(m+1); ans=x*(x-1)*(x-2)/6;for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)if(i|j){llg x=(llg)(n-i+1)*(llg)(m-j+1);ans-=x*(llg)(gcd(i,j)-1);if(i && j) ans-=x*(llg)(gcd(i,j)-1);}printf("%lld",ans);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/lcf-2000/p/6218327.html

總結(jié)

以上是生活随笔為你收集整理的BZOJ 3505 【CQOI2014】 数三角形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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