【组合取补集】数三角形 @CQOI2014/BZOJ3505/upcexam3843
生活随笔
收集整理的這篇文章主要介紹了
【组合取补集】数三角形 @CQOI2014/BZOJ3505/upcexam3843
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://exam.upc.edu.cn/problem.php?id=3843&csrf=8oK86t2oHSgi3Q4SX3qOJGeENe6pfXri
時(shí)間限制: 1 Sec 內(nèi)存限制: 128 MB
題目描述
給定一個(gè)nxm的網(wǎng)格,請計(jì)算三點(diǎn)都在格點(diǎn)上的三角形共有多少個(gè)。下圖為4x4的網(wǎng)格上的一個(gè)三角形。
注意:三角形的三點(diǎn)不能共線。n×m的網(wǎng)格共有(n+1)×(m+1)個(gè)格點(diǎn)。
輸入
輸入一行,包含兩個(gè)空格分隔的正整數(shù)m和n(1<=m,n<=1000)。
輸出
輸出一個(gè)正整數(shù),為所求三角形數(shù)量。
樣例輸入
2 2
樣例輸出
76
取補(bǔ)集的思想,三角形的數(shù)量等于任取三點(diǎn)的情況減去三點(diǎn)共線的情況
#define FILE() freopen("../../in.txt","r",stdin) #include <bits/stdc++.h>using namespace std;typedef long long ll;ll combine(int n) { //n個(gè)點(diǎn)取3個(gè)ll m=n,res=1;for(int i=0; i<3; i++) {if(m%3==0) {res*=m/3;} else res*=m;m--;}return res/2; }int gcd(int a,int b){return b?gcd(b,a%b):a; }int main() { // FILE();int n,m;cin>>n>>m;ll ans = combine((n+1)*(m+1))-(n+1)*combine(m+1)-(m+1)*combine(n+1); //先減去橫豎格線上三點(diǎn)共線的for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) { //類似向量,從(0,0)到(i,j)作一線段 gcd(i,j)+1為線段上格點(diǎn)的數(shù)量ans-=(gcd(i,j)-1)*(n-i+1)*(m-j+1)*2; //乘2是因?yàn)檠貀軸翻轉(zhuǎn)情況一樣}}cout<<ans<<endl;return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/NeilThang/p/9356628.html
總結(jié)
以上是生活随笔為你收集整理的【组合取补集】数三角形 @CQOI2014/BZOJ3505/upcexam3843的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql+innodb数据存储逻辑
- 下一篇: Unity UI代码自动生成