[Cqoi2014]数三角形——组合数

[Cqoi2014]数三角形——组合数[Cqoi2014]数三角形——组合数

大家好,又见面了,我是你们的朋友全栈君。

Description:

给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4×4的网格上的一个三角形。

注意三角形的三点不能共线。

Hint:

1<=m,n<=1000

Solution:

直接算三角形肯定算死。

所以,先考虑所有的可能三角形。再减去不合法的三点共线的情况。

所有三角形:C((n+1)*(m+1),3)

不合法的情况怎么处理??

 

开始的想法:

1.找所有的两端在坐标轴上的直线,算出来整点数:gcd(x,y)+1;再算上下,左右的直线。

但是发现可能有的不合法直线不过边框的整点!!bug

2.考虑直线的方程:ax+by+c=0

a,b,c是常整数。并且都在1~n(m)的范围内。

相当于求x,y的非负整数解的个数。(exgcd)

但是待定系数n^4,枚举系数n^3都不行。bug

 

正解:

优化一下

发现找直线非常复杂。

如果我们找线段呢?并且保证线段的两端都在整点上?相当于把直线根据整点拆开了

(a,b)(c,d)的线段中间的整点有gcd(abs(c-a),abs(d-b))-1个方案。

枚举线段减去中间放点的方案,这样还是n^4

发现,许多的线段本质上是一致的,只是平移了。

所以,我们只需要枚举所有的(0,0)(x,y),就可以了、。

平移的方案就是(n+1-x)*(m+1-y)相当于画出了一个矩形。

对于不是在坐标轴上的点,我们还要乘2,相当于上下一个对称情况。

Code:

#include<cstdio>
#define LL long long
int gcd[1010][1010];
int n,m;
LL t,ans;
inline int getgcd(int a,int b)
{
    if (gcd[a][b])return gcd[a][b];
    if (!a)return gcd[a][b]=b;
    if (!b)return gcd[a][b]=a;
    return gcd[a][b]=getgcd(b,a%b);
}
inline void calc()
{
    for(int i=1;i<=m;i++)gcd[0][i]=i;
    for(int i=1;i<=n;i++)gcd[i][0]=i;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        getgcd(i,j);
}
int main()
{
    scanf("%d%d",&n,&m);
    calc();
    t=(n+1)*(m+1);
    ans=t*(t-1)*(t-2)/6;
    for (int i=0;i<=n;i++)
      for (int j=0;j<=m;j++)
        if (i||j)
        {
            if (!i||!j)ans-=(LL)(gcd[i][j]-1)*(n-i+1)*(m-j+1);
            else ans-=(LL)2*(gcd[i][j]-1)*(n-i+1)*(m-j+1);
        }
    printf("%lld",ans);
}

 

转载于:https://www.cnblogs.com/Miracevin/p/9400674.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107389.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 阿里云产品介绍

    阿里云产品介绍文章目录一、阿里云四大件1、云服务器ECS2、云数据库RDS3、负载均衡SLB4、对象存储OSS5、其他的云计算产品1)内容分发网络CDN:2)专有网络VPC:2)弹性伸缩:二、阿里云安全系列产品1、DDoS高防IP2、安骑士3、证书服务4、态势感知5、堡垒机三、阿里云网络中间件相关消息队列MQ四、阿里云万网产品1、域名2、虚拟主机3、企业邮箱4、云解析DNS公有云和私有云概念bai概念imghttps://www.aliyun.com/product/rds/mysql?spm=a2cls.b9237

    2022年6月2日
    49
  • Linux 下MySQL备份[通俗易懂]

    Linux 下MySQL备份[通俗易懂]Linux下MySQL数据库备份和恢复Linux下MySQL数据库有逻辑备份和物理备份,也可以分为完全备份、部分备份。·完全备份是指备份整个数据集(即整个数据库)·部分备份是指备份部分数据集(只备份一个表)逻辑备份最大优点是对于各种存储引擎,都可以使用同样的方法来备份。而物理备份则不同,不同的存储引擎有着不同的备份方法。mysqldump基本语法mysqldump-uUs…

    2022年6月16日
    32
  • 脉冲信号matlab仿真,脉冲积累matlab仿真[通俗易懂]

    脉冲信号matlab仿真,脉冲积累matlab仿真[通俗易懂]%T_7_1.m%相干积累clearallclcclfc=3e8;%speedoflightTe=100e-6;%发射脉冲宽度Be=1e6;%带宽mu=Be/Te;%调频斜率Ts=1/(2……雷达线性调频脉冲压缩的原理及其MATLAB仿真汇总_中职中专_职业教育_教育专区。LFM脉冲压缩雷达仿真线性调频(LFM)脉冲压缩雷达仿真宋萌瑞20142…

    2022年5月15日
    49
  • win7任务管理器快捷键是什么

    win7任务管理器快捷键是什么根据小编的观察与发现,发现有些小伙伴不是因为不使用快捷键,而是不知道任务管理器的快捷键。所以为了帮助这些小伙伴,小编今天就来告诉你们打开任务管理器的快捷键是什么。我们的电脑其实在打开一些应用的时候,是有快捷键的。但是往往都是因为我们不知道快捷键是什么,所以才会没有用。所以今天小编就来告诉你们打开任务管理器的快捷键是什么。方法一:任务管理器打开的快捷键:ctrl+alt…

    2022年6月18日
    36
  • linux(dpkg 命令用法)[通俗易懂]

    linux(dpkg 命令用法)[通俗易懂]linux环境安装labview

    2022年5月21日
    28
  • pycharm清缓存_pycharm安装包很慢

    pycharm清缓存_pycharm安装包很慢解决pycharm缓存文件问题方法一方法二使用pycharm一段时间后,C盘空间也越来越小。这是因为pycharm在C盘生成了大量的缓存文件。解决C盘占用过大,有两个方法:方法一:直接删除pycharm缓存文件(暴力有效)方法二:更改缓存文件路径方法一content.dat.storageData是pycharm的缓存文件,动辄几个G,直接将其删除即可。不会影响pycharm使用。缺点就是每隔一段时间要记得清理,否则C盘可能就要爆炸。content.dat.storageData文件一般存

    2022年8月28日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号