【hiho一下 第146周】子矩阵求和
【题目链接】:http://hihocoder.com/contest/hiho146/problem/1
【题意】
【题解】
设s[i][j]表示左上角的坐标为(i,j)的n*m的矩阵的和;
有s[i][j]=s[i-1][j-1]+n*m;
不信自己看;
而且
对于i>=max(n,m)
s[i][j]=s[i+1][j];
对于j>=max(n,m)
s[i][j]=s[i][j+1];
而每一行从左到右的元素和;
每一列从上刀下的元素的和是有规律的;
就是前x个数是等差,后面全都相等;
然后根据这个
我们只要算出
s[1][1..max(n,m)]
和s[1..max(n,m)][1]
然后算出这2*max(n,m)个对角线上的各个位置作为左上角的矩阵的和就好;
当然不能强算了;
根据
s[i][j]=s[i-1][j-1]+n*m;
我们知道
s[i][j]之后;
相当于要求最小的x
使得
(s[i][j]+x*n*m%k)==0
这里我们可以预处理出最小的使得x*n*m%k==t的x;
记录下每个t对应的x就好;(当然有一些t可能没办法得到);
这样根据s[1][1..max(n,m)]和s[1..max(n,m)][1]算出每个对角线上有没有可能有有符合要求的点;
每次往下走的时候只会改变一行或一列的和;
所以可以做到O(1)算出来;
【Number Of WA】
17
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 110;
const int K = 1e6+100;
int n,m,k,need[K],px,py;
void pre()
{
ms(need,-1);
LL now = 0;int x = 0;
while (need[now]==-1)
{
need[now] = x;
now = (now+1LL*n*m)%k;
x++;
}
}
int get_sum(int idx,int len)
{
if (len<=idx)
return (1LL*(1+len)*len/2)%k;
else
return (1LL*(1+idx)*idx/2 + 1LL*(len-idx)*idx)%k;
}
void gengxin(int x,int y)
{
if (px==-1 && py==-1)
{
px = x,py = y;
return;
}
if (x+y<px+py)
{
px = x,py = y;
}
else
if (x+y==px+py && x<px)
{
px = x,py = y;
}
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
ios::sync_with_stdio(false);
int Q;
cin >> Q;
while (Q--)
{
px=-1,py=-1;
cin >> n >> m >> k;
pre();
//左上角n行m列的矩阵和
LL sum = 0,tsum;
rep1(i,1,m)
sum=(sum+get_sum(i,n))%k;//相当于加上第i列的n行元素
tsum = sum;
int ma = max(m,n);
rep1(nowy,1,ma)
{
int t = (k-sum)%k;
if (need[t]!=-1)
gengxin(1+need[t],nowy+need[t]);
sum=(sum-get_sum(nowy,n)+k+get_sum(nowy+m,n))%k;
}
sum = tsum;
rep1(nowx,1,ma)
{
int t = (k-sum)%k;
if (need[t]!=-1)
{
int x = nowx+need[t],y = 1+need[t];
gengxin(x,y);
}
sum=(sum-get_sum(nowx,m)+k+get_sum(nowx+n,m))%k;
}
if (px==-1)
cout <<-1<<endl;
else
cout <<px <<' '<<py<<endl;
}
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
【hiho一下 第146周】子矩阵求和的更多相关文章
- 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point
// 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point // 思路:直接暴力绝对T // 先确定x范围,每个x范围内,离圆心最远的点一定是y轴两端的点.枚举x的范围,再 ...
- hiho一下 第115周:网络流一•Ford-Fulkerson算法 (Edmond-Karp,Dinic,SAP)
来看一道最大流模板水题,借这道题来学习一下最大流的几个算法. 分别用Edmond-Karp,Dinic ,SAP来实现最大流算法. 从运行结过来看明显SAP+当前弧优化+gap优化速度最快. hi ...
- hihoCoder [Offer收割]编程练习赛3 D子矩阵求和
子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...
- 【hiho一下第77周】递归-减而治之 (MS面试题:Koch Snowflake)
本题是一道微软面试题,看起来复杂,解出来会发现其实是一个很简单的递归问题,但是这道题的递归思路是很值得我们反复推敲的. 原题为hihocoder第77周的题目. 描述 Koch Snowflake i ...
- hiho一下 第207周
题目1 : The Lastest Time 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 What is latest time you can make with ...
- hiho一下第130周 后缀自动机二·重复旋律7
后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...
- hiho一下第128周 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- 【hiho一下】第一周 最长回文子串
题目1:最长回文子串 题目原文:http://hihocoder.com/contest/hiho1/problem/1 [题目解读] 题目与 POJ 3974 palindrome 基本同样.求解最 ...
- Solution: 最近公共祖先·一 [hiho一下 第十三周]
题目1 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中 ...
随机推荐
- STM32:SWD下载方式
最近没事干做了个STM32小板子,芯片是STM32VBT6,下载方式用的SWD,比JTAG节省空间 我用了五根线,3.3V,GND,RESET,SWDIO,SWCLK, JTAG 接口pin map: ...
- 基于Hive的手机应用信息统计分析系统
目录 项目概要 具体实现 HIVE查询 项目概要 需求 手机应用日志 定期离线分析手机应用新增用户.活跃用户.沉默用户.启动次数.版本分布和留存用户等业务指标. 工作流程 手机APP启动时,上报启动日 ...
- html5中不再支持的元素
html5中不再支持的元素:1.acronym(建议abbr) : 定义首字母缩写2.applet(建议object): 定义 applet3.basefont(使用css控制)4.big(使用css ...
- [App Store Connect帮助]二、 添加、编辑和删除用户(3)添加和编辑用户
您可以在“用户和访问”中添加和编辑用户. 如果您以个人名义在“Apple 开发者计划”注册,您可以授权用户访问您 App Store Connect 中的内容.所有用户只拥有 App Store Co ...
- String,StringBuffer和StringBuilder
在执行速度方面的比较:StringBuilder > StringBuffer StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操 ...
- 【BZOJ2595_洛谷4294】[WC2008]游览计划(斯坦纳树_状压DP)
上个月写的题qwq--突然想写篇博客 题目: 洛谷4294 分析: 斯坦纳树模板题. 简单来说,斯坦纳树问题就是给定一张有边权(或点权)的无向图,要求选若干条边使图中一些选定的点连通(可以经过其他点) ...
- 337 House Robber III 打家劫舍 III
小偷又发现一个新的可行窃的地点. 这个地区只有一个入口,称为“根”. 除了根部之外,每栋房子有且只有一个父房子. 一番侦察之后,聪明的小偷意识到“这个地方的所有房屋形成了一棵二叉树”. 如果两个直接相 ...
- [转]asp.net MVC 常见安全问题及解决方案
本文转自:http://www.cnblogs.com/Jessy/p/3539564.html asp.net MVC 常见安全问题及解决方案 一.CSRF (Cross-site request ...
- JS——null
变量被赋值为null,目的往往是为了销毁这个对象: var n1 = 1; n1 = null;
- CSS——border
表格细线: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...