喵哈哈的矩阵

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/problem/show/1250

Description

人尽皆知,在喵哈哈村,有一个法力无边的廖神

他随手一挥,便移走山岳;他随手一指,便填平沟壑;他抬头一望,便斗转星移。

突然,他嘟嘟嘟的在念着咒语,只听噼啪一声,在喵哈哈村的中心广场就出现一个巨大的矩阵

村子里的人纷纷称奇。

好奇的沈宝宝走上前去,看了看这个矩阵。

这个矩阵是n行m列的矩阵。

矩阵很大,大到无法无天。

矩阵很小,小到只有n*3个元素。

因为,沈宝宝发现了其中的端倪。

假设T[i][j]表示原矩阵第i行j列的元素大小,那么 T[i][j] = A[i] x j x j + B[i] x j + C[i]

被人称奇的廖神,笑:“沈宝宝,就算让你看穿这个矩阵又如何?那你能否看出这个矩阵中究竟有多少个K呢?”

沈宝宝想了想,便轻松解决了这个问题。

廖神不断地更改K的值,不停的问着

沈宝宝不停的回答着

真是神奇。

“啪!坐在窗子边上的陈同学,不要睡觉了!刚才文中提到的沈宝宝,他的每次回答的答案是什么?答不上来,就叫你的家长下午来见我!”,何老师怒道。

陈同学一点都不方,尽管他只记得矩阵的端倪和廖神每次提问的K。就在他站起来的那几秒,他已经口算出答案了。

而你,你知道吗?

Input

第1行 n,m 表示矩阵n行m列

第2到n+1行 a[i],b[i],c[i],表示沈宝宝所看出的端倪

第n+2行 Q,表示被人称奇的廖神向沈宝宝提问的次数

第n+3到n+Q+2行,K,表示每次廖神提问的K是什么

我们保证:1<=n<=50000 ,1<=m<=10^9,-10^9<=Ai,Bi,Ci<=10^9,0<=Q<=1000,k<=10^18

都是整数~

矩阵都是从1开始的哦~

Output

Q行答案

每一行一个整数,表示K出现的次数

Sample Input

3 3
1 2 3
3 4 5
2 3 4
3
18
7
6

Sample Output

2
0
1

HINT

题意

题解:

这道题的做法主要分为以下两种:

我们直接把矩阵暴力出来,然后对于每一个询问O(1)去回答,这样的时间复杂度是O(nm),空间复杂度是O(1e9),很显然不能接受。

对于每次询问,我们直接暴力算出每一行存在多少个K就好了,然后把每一行的ans加起来就是答案。由于每一行都是二次函数,那么我们讨论存在多少个K就比较轻松了,既可以二分得到,也可以利用二次函数的求根公式来解决。时间复杂度分别是O(qnlogm),O(qn),而空间复杂度O(1)。

在题目所规定的的数据范围内,是可以通过的。

下面,我们就主要讲讲如何通过二次函数的求根公式来解决这个题目~

对于每一行,我们首先变形一下,使得c[i] = c[i] - k;

这样,方程就变为 a[i]*x*x+b[i]*x+c[i] = 0,我们只要讨论在[1,m]中存在多少个整数解,即是这一行的答案。

首先讨论a[i] = 0,b[i] = 0的情况,这样变成一个常数方程,很简单

然后讨论a[i] = 0,b[i] != 0,这样是一个一次函数,可以O(1)得到答案,然后再判断是否为整数,这个整数是否在[1,m]就好了。

接着就是二次函数了,首先判断Δ。然后按照Δ分类讨论就好。也比较简单。

注意,答案可以会超过int哦~

然后,这道题就结束了!

代码:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n,m;
#define maxn 100005
double eps = 1e-;
long long a[maxn],b[maxn],c[maxn];
long long gcd(long long a,long long b)
{
if(b==)return a;
return gcd(b,a%b);
}
long long ans;
void solve(long long x)
{
for(int i=;i<=n;i++)
{
if(a[i]==&&b[i]==)
{
if(c[i]==x)ans+=m;
}
else if(a[i]==)
{
long long BI = b[i];
long long KI = x-c[i];
if(gcd(BI,KI)==BI&&KI/BI<=m&&KI/BI>=)
ans+=;
}
else
{
long long A = a[i],B = b[i],C = c[i]-x;
long long p = B*B - 4LL*A*C;
if(p<)continue;
if(p==)
{
if(gcd(-B,2LL*A)==2LL*A&&-B/(2LL*A)<=m&&-B/(2LL*A)>=)
ans++;
}
if(p>)
{
double x1 = (-B + sqrt(B*B-*A*C))/(*A);
double x2 = (-B - sqrt(B*B-*A*C))/(*A);
long long X1 = x1;double XX1 = X1;
if(abs(XX1-x1)<=eps)
{
if(x1<=m&&x1>=)ans++;
}
long long X2 = x2;double XX2 = X2;
if(abs(XX2-x2)<=eps)
{
if(x2<=m&&x2>=)ans++;
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
int q;scanf("%d",&q);
while(q--)
{
long long k;scanf("%lld",&k);
ans = ;
solve(k);
printf("%lld\n",ans);
}
}

cdoj 1250 喵哈哈的矩阵 数学题的更多相关文章

  1. 【wikioi】1250 Fibonacci数列(矩阵乘法)

    http://wikioi.com/problem/1250/ 我就不说这题有多水了. 0 1 1 1 矩阵快速幂 #include <cstdio> #include <cstri ...

  2. 1250 Fibonacci数列(矩阵乘法快速幂)

    1250 Fibonacci数列  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 定义:f0=f1=1, f ...

  3. 矩阵乘法快速幂 codevs 1250 Fibonacci数列

    codevs 1250 Fibonacci数列  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 定义:f0=f1=1 ...

  4. uva 10161 Ant on a Chessboard 蛇形矩阵 简单数学题

    题目给出如下表的一个矩阵: (红字表示行数或列数) 25 24 23 22 21 5 10 11 12 13 20 9 8 7 14 19 3 2 3 6 15 18 2 1 4 5 16 17 1 ...

  5. 1250 Fibonacci数列(矩阵乘法)

    1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1, fn=fn-1+fn ...

  6. CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版

    "问题:众所周知772002很喜欢马尾,所以他决定画几幅马尾送给他的女朋友. 772002会画m种马尾,772002还有n张纸,n张纸分别编号1到n,每张纸上只能画一种马尾. 然而77200 ...

  7. CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂

    772002画马尾 题目连接: http://acm.uestc.edu.cn/#/problem/show/1280 Description 众所周知772002很喜欢马尾,所以他决定画几幅马尾送给 ...

  8. [codevs]1250斐波那契数列<矩阵乘法&快速幂>

    题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...

  9. luogu 3790 文艺数学题 - 矩阵树定理 - 容斥原理

    题目传送门 戳我来传送 题目大意 给定一个图,问它的所有生成树的边权的最大公约数之和. 可以考虑计算边权的最大公约数为$i$的生成树的个数$f(i)$,最后累加答案. 然后考虑这样的生成树的个数怎么求 ...

随机推荐

  1. 浏览器兼容——jquery的html()不兼容IE

    在看着一个页面A,是一个弹出框,用的jquery中的ajax,然后弹出的内容是另一个Div的.而所出现的问题,是在浏览器中都有弹出框,但是只有谷歌和火狐中的弹出框中内容. 当时,我所想到的是另一个问题 ...

  2. 应用市场高速下载以及网页端调起APP页面研究与实现

    Github博文地址,此处更新可能不是很及时. 好久没写博客了,好大一个坑.正好,最近刚做完应用市场的高速下载功能,便拿来填了这个坑. 话说产品为了增加用户量,提升用户活跃度以及配合推广,更坑爹的是看 ...

  3. ios游戏开发--cocos2d学习(2)

    在第一节中简单介绍了2d项目模板HelloWorld的基础代码,并做了一点小小的改变,像触摸接收.旋转.移动和颜色转变序列CCSequence的使用等等,2d本身封装好了很多方便使用的动作,只需要调用 ...

  4. DOM笔记(一):HTMLDocument接口

    操作HTML文档的第一步就是获取对文档元素的引用,每一个元素在DOM中就是一个节点,所有的元素在DOM中构成一个节点树. 用于获取元素节点定义的方法定义于HTMLDocument接口,window.d ...

  5. CSS 3的display:盒类型详解

    在CSS中,使用display属性来定义盒的类型.总体来说,盒类型分为两类:inline和block.如div默认是block,span默认是Inline.可以通过display修改默认的表现方式. ...

  6. flot图表的使用

    Flot是一套用Javascript写的绘制图表用的函式库, 专门用在网页上执行绘制图表功能, 由于Flot利用jQuery所以写出来的, 所以也称它为jQuery Flot ,它的特点是体积小.执行 ...

  7. anaconda在linux下的安装注意事项

    不应该做什么 官网原文: Installation Instructions Linux Install These instructions explain how to install Anaco ...

  8. Web Service学习之一:Web Service原理

    一.定义 Web Service 不是框架也不是技术 而是解决远程调用.跨平台调用.跨语言调用问题的一种规范. 二.应用1.同一个公司新.旧系统的整合:比如CRM系统与OA.客服系统相互调用2.不同公 ...

  9. MongoDB的备份与恢复

    0. 目录 整库备份 整库恢复 单collection备份 单collection恢复 1. 备份 MongoDB提供了备份工具,mongodump.exe,在bin目录下,其用法如下: mongod ...

  10. RTT操作系统

    http://www.rt-thread.org/官网 RT-Thread RTOS,由国内一些专业开发人员开发.维护.它不仅仅是一款 高效.稳定的实时操作系统内核,也是一套面向嵌入式系统的软件平台, ...