·题目:

        西施与范蠡泛舟而去……不对,场景不对,咳咳。在甄嬛前往蓬莱洲之前,她与皇上在碧桐书院告别。为了这可能会长达数月的离别,两个人都似乎有很多话要对对方说,却都无语凝噎。这时,皇上突然发话:“嬛嬛啊(桓桓?),既然你我都说不出话来,那这时间也不好打发,我们来数三角形吧。”为了满足皇上突发而来的童趣,甄嬛欣然陪同了。可这……纸上是一张n*m的格子方阵,即有(n+1)*(m+1)个格点。每个格子都是边长为1的正方形。而他们要数的,则是任取3个格点作为三角形的顶点所形成的直角三角形且该三角形面积为s/2的个数。甄嬛数的头都晕了,她现在只想知道满足条件的三角形个数 mod 1000000007。

输入格式:第一行3个正整数n,m,s, 意义如题
输出格式:仅一个整数,为甄嬛与满足条件的三角形个数 mod (10^9+7)
样例输入:1 1 1
样例输出:4
数据范围:
对于10%的数据:n<=10
对于另外40%的数据:s为质数
对于100%的数据:1<=n,m,s<=108
时间限制: 1S
空间限制: 128M

·题目混乱,述大意:

     给定长度为n*m的相同正方形方格组成的棋盘,求出使用格点组成的三角形个数,答案取模1000000007。(n,m<=108)。

·分析:

      在草稿纸上画图时容易发现一些普遍规律和特例,此时大米饼认为应该先里找出总体的方法,再进行特例的处理(如去重),这样很美妙。一个非常简单的思路是,设这个三角形的边长为a,b,那么在棋盘上就有如下摆法:

    

     同时要算上棋盘旋转90o后的情况,不要忘记一个三角形可以在同一个长方形里有四种摆法,所以对于这个形状的三角形的个数P可以表示为:

     P=(n-a+1)*(m-b+1)*4+(n-b+1)*(m-a+1)*4

     读题一会儿后意识到一个问题是三角形的边可以是斜着的。上文的天真方法连正确答案都无法得出:

     在经历初中数学洗礼的我们开始回想起中考时的一些琐碎,发现好像很多几何题都是这样子的——有关相似直角三角形。清晰地发现,这些三角形的直角边无非是由两个相似的直角三角形的斜边组成:

     依照这个思路,做一些便于代码书写的分析。首先使用a,b表示出橙色三角形的面积S=(a2+b2)*k[注意,k不一定偏要为整数,想一想,不为什么]。我们看一看数据范围:n,m<=100000000,开方后为10000,说明最坏情况循环下循环次数:108。不过,这里我们需要保证a,b,ak,bk均为整数,也就是分解数——“与分解有关的时间复杂度稳定性很差”,我们可以直接暴力枚举a,b,找到所有满足面积公式条件的二元组(a,b),并由此可以推出对应的k值。

     与此同时,一个更加振奋人心的消息——上文那种边与格子平行的情况可以看做(a,b)其中一个为0的情况,所以我们争取一起处理。

     这样看来,似乎只需要进行一个二重循环枚举a,b然后使用类似于上文的天真方法计算答案就可以了。在激动之余,你发现还有一些特殊情况。

     为了有序性和避免重复,我们规定枚举二元组(a,b)必须满足k的值大于等于1。我们先列出一般情况的答案计算方法。对于一组(a,b)构成面积为S的三角形的个数P计算方法:
    

    对于这个三角形,我们只需要求出其所在的最小矩形的长宽就可以了。由于a,b的大小关系不确定。所以:

     宽长度为:max(a,bk),长长度为:b+ak

   我们设长宽分别为p,q,那么S的个数为:

     P=(n-p+1)*(m-q+1)*4+(n-p+1)*(m-q+1)*4

    最后我们着眼于两种特殊情况的处理:

   [1] k==1:

      由于a,b大小不定,所以如果(a,b)满足,那么(b,a)也是合法的,此时相当于计算了8次,但是我们发现,由于k值为1,所以相似三角形为等腰,重复计算了,所以处理方式是除以二。

   [2] a==0||b==0:

     这表明是一个直角边和格子边平行的直角三角形。设u>0,如果二元组(u,0)合法,那么(0,u)同样合法,但是!(u,0),(0,u)形成的三角形形状完全相同,而(u,v),(v,u)[v>0]形成的三角形形状是相同或者不同,但是相同的情况被[1]的处理方式而排除,可是(u,0)(0,u)的重复计算没有排除。随意处理方式也是除以二。

     考试结束后其实很多STD的写法是将(a,b)中是否有0进行分开计算,这样更容易理解。但是追求更深刻理解和短码的大米饼毫不犹豫地视作一种情况讨论。代码来啦:

 #include<stdio.h>
#include<algorithm>
#define ll long long
#define M 1000000007
#define go(i,a,b) for(ll i=a;i<=b;i++)
using namespace std;
ll n,m,s,t,res,ans,A,B,T,X,Y;
ll Cal(ll a,ll b){return max(1ll*,n-a+)*max(1ll*,m-b+)%M;}
int main()
{
scanf("%lld%lld%lld",&n,&m,&s);
go(a,,M){if(a*a>s)break;
go(b,a?:,M){if((res=a*a+b*b)>s)break;
if(1ll*a*s%res||1ll*b*s%res)continue;
A=a*s/res,B=b*s/res;T=res==s?:;
if(a==||b==)T/=;X=b+A;Y=max(a,B);
(ans+=T*Cal(X,Y)+T*Cal(Y,X))%=M;
}}printf("%lld",(ans%M+M)%M);return ;
}//Paul_Guderian

如果青春是一捧鲜花,我愿把它洒给你,

如果生命是一场燃烧的旧梦,

我愿在梦醒前燃烬……   ————汪峰《忧郁的眼睛》

【无语凝噎(wordless)】的更多相关文章

  1. 【转】关于phpcms的学习

    在实现PHPCMS网站过程中,根据业务需求,我们遇到很多问题,特此总结如下,以便大家参考学习. [1]PHPCMS V9系统目录简析 在研究所有问题之前,请先了解一下系统的文件目录结构,具体如下图所示 ...

  2. PHPCMS V9 学习总结

    在实现PHPCMS网站过程中,根据业务需求,我们遇到很多问题,特此总结如下,以便大家参考学习. [1]PHPCMS V9系统目录简析 在研究所有问题之前,请先了解一下系统的文件目录结构,具体如下图所示 ...

  3. 微信JSSDK与录音相关的坑

    欢迎各位转载, 以让微信团队重视这些恼人的BUG. 请注明出处微信JSSDK与录音相关的坑 by lzl124631x 最近一直在做微信JSSDK与录音相关的功能开发, 遇到了各种奇尺大坑, 时不时冷 ...

  4. PHPCMS V9 学习总结(转)

    转自:http://www.cnblogs.com/Braveliu/p/5074930.html 在实现PHPCMS网站过程中,根据业务需求,我们遇到很多问题,特此总结如下,以便大家参考学习. [1 ...

  5. phpcms图文总结(转)

    转自:http://www.cnblogs.com/Braveliu/p/5074930.html 在实现PHPCMS网站过程中,根据业务需求,我们遇到很多问题,特此总结如下,以便大家参考学习. [1 ...

  6. 微信JSSDK与录音相关的坑

    微信JSSDK与录音相关的坑 最近一直在做微信JSSDK与录音相关的功能开发, 遇到了各种奇尺大坑, 时不时冷不丁地被坑一道, 让我时常想嘶吼: "微信JSSDK就是个大腊鸡!!!!!!!! ...

  7. 模仿某旅行网站 纯css实现背景放大效果

    基本功能是鼠标移动到图片上,对应宽度变宽.其中布局和基本样式直接copy官网,功能部分是自己瞎鼓捣实现的. 直接上代码: HTML部分 <div class="fold_wrap&qu ...

  8. Python-GUI编程-PyQt5

    Python-GUI编程-PyQt5 1. GUI编程是什么? GUI 全称为: Graphical User Interface;简称GUI翻译为中文为: 图形化用户接口简单理解就是:- 使用Pyt ...

  9. #学习笔记#e2e学习使用(一)

    本文仅限于记录本人学习的过程,以及怎么踩的坑,是如何解决的.逻辑肯定是混乱的,有用之处会抽出共通另行发帖. 最终目标:要运用于Vue项目中,进行功能测试甚至自动化测试. 一.e2e概念 理解:end ...

随机推荐

  1. jQuery 写的textarea输入字数限制

    //先判断浏览器是不是万恶的IE        var bind_name = 'input';//默认事件        if (navigator.userAgent.indexOf(" ...

  2. 记一次SQL调优/优化(SQL tuning)——性能大幅提升千倍以上

    好久不写东西了,一直忙于各种杂事儿,恰巧昨天有个用户研发问到我一个SQL调优的问题,说性能太差,希望我能给调优下,最近有些懒,可能和最近太忙有关系,本来打算问问现在的情况,如果差不多就不调了,那哥们儿 ...

  3. phalcon框架命名空间

    命名空间第一影像就是实际上就相当宏定义,就是需要把一个很长的带有路径的类文件指定一个空间,然后就可直接用简单简写模式 当然如果是外部文件需要首先引入外部文件,如果不引入外部文件还是会报错.一般最会出错 ...

  4. Asp.net容器化

    注意:本文只用于探讨asp.net容器化,不建议生产环境下使用(docker 镜像太大!!!!) 安装docker 准备一个台windwos server 2016 ,在PowerShell 里执行以 ...

  5. ORM “杀器”之 JOOQ

    ORM “杀器”之 JOOQ IN 后端编程,JAVA,敏捷开发,数据库 JOOQ是啥? JOOQ 是基于Java访问关系型数据库的工具包,轻量,简单,并且足够灵活,可以轻松的使用Java面向对象语法 ...

  6. kubernetes进阶(04)kubernetes的service

    一.service概念 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口.借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级.Service ...

  7. Docker学习笔记 - Docker的守护进程

    学习目标:  查看Docker守护进程的运行状态 启动.停止.重启Docker守护进程 Docker守护进程的启动选项 修改和查看Docker守护进程的启动选项 1.# 查看docker运行状态  方 ...

  8. Spring Security 入门(1-2)Spring Security - 从 配置例子例子 开始我们的学习历程

    1.Spring Security 的配置文件 我们需要为 Spring Security 专门建立一个 Spring 的配置文件,该文件就专门用来作为 Spring Security 的配置. &l ...

  9. ssh整合之一spring的单独运行环境

    这是本人第一次写博客,不足之处,还希望各位园友指出,在此先谢谢各位了! 先说我们的这三大框架,即struts,spring,hibernate,我们要进行整合的话,第一步是先单独搭建我们的Spring ...

  10. WebStorm2018破解

    参考网站http://www.sdbeta.com/wg/2018/0302/220048.html修改整理如下: webstorm 2018.1正式版破解summary jetbrainscrack ...