一本通1655数三角形
1655:數(shù)三角形
時(shí)間限制: 1000 ms ??? ??? 內(nèi)存限制: 524288 KB【題目描述】
給定一個(gè)?n×m?的網(wǎng)格,請(qǐng)計(jì)算三點(diǎn)都在格點(diǎn)上的三角形共有多少個(gè)。下圖為?4×4?的網(wǎng)格上的一個(gè)三角形。
注意:三角形的三點(diǎn)不能共線。
【輸入】
輸入一行,包含兩個(gè)空格分隔的正整數(shù)?m?和?n。
【輸出】
輸出一個(gè)正整數(shù),為所求三角形數(shù)量。
【輸入樣例】
2 2【輸出樣例】
76【提示】
數(shù)據(jù)范圍與提示:
對(duì)于所有數(shù)據(jù),1≤m,n≤1000。
?
sol:肯定是算不能構(gòu)成三角形的方案數(shù)比較容易。
總方案數(shù)就是C(n*m,3)
不能構(gòu)成的有兩種情況
1)三個(gè)點(diǎn)都在同一條與水平面平行或垂直的線上 C(n,3)*m+C(m,3)*n
2)對(duì)于一條任意長(zhǎng)度的斜線,設(shè)其兩端坐標(biāo)為(1,1) (a,b),那么斜線上格點(diǎn)的個(gè)數(shù)就是gcd(a-1,b-1)+1,在整個(gè)矩形中這樣的斜線會(huì)有(n-a+1)*(m-b+1)條,但是直接在這條斜線上任取三個(gè)點(diǎn)會(huì)有重復(fù),所以欽定兩個(gè)端點(diǎn)必須取,中間任取一個(gè)點(diǎn)
注意有斜線有兩個(gè)方向,這樣的要減兩倍
#include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll read() {ll s=0;bool f=0;char ch=' ';while(!isdigit(ch)){f|=(ch=='-'); ch=getchar();}while(isdigit(ch)){s=(s<<3)+(s<<1)+(ch^48); ch=getchar();}return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) {if(x<0){putchar('-'); x=-x;}if(x<10){putchar(x+'0'); return;}write(x/10);putchar((x%10)+'0');return; } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar('\n') ll n,m; inline ll gcd(ll x,ll y) {return (!y)?(x):(gcd(y,x%y)); } int main() {ll i,j,ans=0,Sum=0;n=read()+1; m=read()+1;ans=(n*m)*(n*m-1)*(n*m-2)/6;ans-=m*n*(n-1)*(n-2)/6;ans-=n*m*(m-1)*(m-2)/6;for(i=2;i<=n;i++){for(j=2;j<=m;j++){ll tmp=gcd(i-1,j-1)+1;if(tmp>2) Sum+=(tmp-2)*(n-i+1)*(m-j+1);}}Wl(ans-(Sum<<1));return 0; } /* input 2 2 output 76input 6 9 output 52758 */ View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/gaojunonly1/p/10543963.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的一本通1655数三角形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JavaScript实现省市联动
- 下一篇: 省选前的反演抢救计划