本文主要是介绍2020寒假牛客第一场——A honoka和格点三角形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
示例1
思路:
x方向有m格点,y方向n个格点
面积为1的三角形有两种情况:底2高1,底1高2
第一种情况:底2高1
(1)平行x轴:最下面一行开始,每一行有(m-2)个长为2的线段,上面一行对应m个格点全部可以连成三角形,一共(n-1)行,从最上面开始同理,所以共:2*(m-2)m(n-1)
(2)平行y轴:同上,m,n交换位置:2*(n-2)n(m-1)
第二种情况:底1高2
因为直角三角形的情况是和上面重复的,同时平行x,y轴,所以不要重复计算
(1)平行x轴:从最下面一行开始,每行(m-1)个长为1的线段,上面一行对应m个点中,有2个构成直角三角形,要减去,所以有(m-2)个点可连,共(n-2)行,从最上面开始数同理,所以共:2*(m-1)(m-2)(n-2)
(2)平行y轴:同上,m,n交换位置:2*(n-1)(n-2)(m-2)
因为数据过大,要用long long,且每一步都取模
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int main(){long long int sum=0,m,n;scanf("%lld%lld",&m,&n);sum+=2*(n-1)%mod*(m-2)%mod*m%mod;sum+=2*(n-2)%mod*(m-1)%mod*n%mod;sum+=2*(n-1)%mod*(n-2)%mod*(m-2)%mod;sum+=2*(m-1)%mod*(m-2)%mod*(n-2)%mod;printf("%lld",sum%mod);return 0;
}
有大佬因式分解(ab)%c=((a%c)(b%c))%c
结果如下
#include<stdio.h>
#define mod 1000000007
int main()
{long long int sum,m,n;scanf("%lld%lld",&m,&n);long long int a,b;a=2*(m+n-2);b=(2*m*n-3*m-3*n+4);sum=((a%mod)*(b%mod))%mod;//底为1高为2,底为2高为1printf("%lld\n",sum );return 0;
}
这篇关于2020寒假牛客第一场——A honoka和格点三角形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!