一本通1655数三角形
生活随笔
收集整理的這篇文章主要介紹了
一本通1655数三角形
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1655:數三角形
時間限制: 1000 ms ??? ??? 內存限制: 524288 KB【題目描述】
給定一個?n×m?的網格,請計算三點都在格點上的三角形共有多少個。下圖為?4×4?的網格上的一個三角形。
注意:三角形的三點不能共線。
【輸入】
輸入一行,包含兩個空格分隔的正整數?m?和?n。
【輸出】
輸出一個正整數,為所求三角形數量。
【輸入樣例】
2 2【輸出樣例】
76【提示】
數據范圍與提示:
對于所有數據,1≤m,n≤1000。
?
sol:肯定是算不能構成三角形的方案數比較容易。
總方案數就是C(n*m,3)
不能構成的有兩種情況
1)三個點都在同一條與水平面平行或垂直的線上 C(n,3)*m+C(m,3)*n
2)對于一條任意長度的斜線,設其兩端坐標為(1,1) (a,b),那么斜線上格點的個數就是gcd(a-1,b-1)+1,在整個矩形中這樣的斜線會有(n-a+1)*(m-b+1)條,但是直接在這條斜線上任取三個點會有重復,所以欽定兩個端點必須取,中間任取一個點
注意有斜線有兩個方向,這樣的要減兩倍
#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?
轉載于:https://www.cnblogs.com/gaojunonly1/p/10543963.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的一本通1655数三角形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript实现省市联动
- 下一篇: 省选前的反演抢救计划