http://hihocoder.com/problemset/problem/1286

题解

NB分析题。

首先我们令\(s[i][j]\)表示以\((i,j)\)为左上角的矩形的权值和。

因为\(a[i][j]+1=a[i+1][j+1]\)。

所以\(s[i][j]+n*m=s[i+1][j+1]\)。

再有当\(i\geq m\)时\(s[i][1]=s[i+1][1]\)。

\(j\geq n\)时\(s[1][i]=s[1][i+1]\)。

那么我们若知道一个\((i,j)\)值,那么所有的\((i+x,j+x)\)中最小的合法解可以通过解同余方程求出。

根据发现的性质,只需要枚举\(n+m\)个\((i,j)\)即可。

代码

#include<bits/stdc++.h>
#define N 200009
using namespace std;
typedef long long ll;
ll n,m,k;
ll dp[N];
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
struct node{
int x,y;
inline bool operator <(const node &b)const{
if(x+y!=b.x+b.y)return x+y<b.x+b.y;
return x<b.x;
}
}ans;
inline ll Sum(ll n){return n*(n+1)/2;}
inline ll sum(ll n,ll m){
if(!n||!m)return 0;
if(n>m)swap(n,m);
return dp[n]*2-Sum(n)+(m-n)*Sum(n);
}
inline ll calc(ll x,ll y,ll n,ll m){
return sum(x+n-1,y+m-1)-sum(x-1,y+m-1)-sum(x+n-1,y-1)+sum(x-1,y-1);
}
inline void prework(ll n){
for(int i=1;i<=n;++i)dp[i]=dp[i-1]+1ll*i*(i+1)/2;
}
ll xx,yy,g;
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
void exgcd(ll a,ll b){
if(!b){
xx=1;yy=0;
return;
}
exgcd(b,a%b);
ll k=xx;
xx=yy;
yy=k-(a/b)*yy;
}
inline int solve(ll x,ll y,ll k){
x%=k;y%=k;
x=k-x;
if(x%g)return -1;
ll o=(xx*(x/g)%(k/g)+(k/g))%(k/g);
return o;
}
int main(){
int Q=rd();
prework(200000);
while(Q--){
n=rd();m=rd();k=rd();
g=gcd(1ll*n*m%k,k);
exgcd(1ll*n*m%k,k);/
bool tag=0;
int aa=1e9;
ans=node{aa,aa};
for(int i=1;i<=n;++i){
int x=solve(calc(1,i,n,m),1ll*n*m,k);
if(x!=-1){
tag=1;
node du=node{1+x,i+x};
if(du<ans)ans=du;
}
}
for(int i=1;i<=m;++i){
int x=solve(calc(i,1,n,m),1ll*n*m,k);
if(x!=-1){
tag=1;
node du=node{i+x,1+x};
if(du<ans)ans=du;;
}
}
if(tag){
printf("%d %d\n",ans.x,ans.y);
}
else puts("-1");
}
return 0;
}

hihocoder1286 : 子矩阵求和的更多相关文章

  1. hihoCoder [Offer收割]编程练习赛3 D子矩阵求和

    子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...

  2. HDU 6336 子矩阵求和

    Problem E. Matrix from Arrays Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 ...

  3. 【hiho一下 第146周】子矩阵求和

    [题目链接]:http://hihocoder.com/contest/hiho146/problem/1 [题意] [题解] 设s[i][j]表示左上角的坐标为(i,j)的n*m的矩阵的和; 有s[ ...

  4. HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)

    6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...

  5. 【HDOJ-1081】To The Max(动态规划)

    To the Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem ...

  6. AtCoder Grand Contest 018题解

    传送门 \(A\) 根据裴蜀定理显然要\(k|\gcd(a_1,...,a_n)\),顺便注意不能造出大于\(\max(a_1,...,a_n)\)的数 int n,g,k,x,mx; int mai ...

  7. 【JZOJ4817】【NOIP2016提高A组五校联考4】square

    题目描述 输入 输出 样例输入 3 4 1 1 0 1 0 1 1 0 0 1 1 0 5 1 1 2 3 2 1 3 2 3 2 3 4 1 1 3 4 1 2 3 4 样例输出 1 1 1 2 2 ...

  8. 【ACM程序设计】前缀和

    前缀和 ​ 前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和 作用: 一种预处理,求出的前缀和数组可以使得,输出原序列中从第l个数到第r个数和的时间复杂度变成了O(1) . 一维前缀和 ...

  9. 2021-2022 ICPC, NERC, Northern Eurasia Onsite (Unrated, Online Mirror, ICPC Rules, Teams Preferred) J. Job Lookup

    题意 n个节点,n<=200,你需要构造这n个几点成为一棵树,并且这棵树的中序遍历为1-n; 你构造树的节点之间的最短路构成一个n×n的最短距离矩阵d: 同时给你n×n的权重矩阵c:最最小的Σd ...

随机推荐

  1. Nginx/Nginx基础学习

    Nginx与node.js 一.Nginx与Node.js Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡. ...

  2. FHJ学长的心愿 QDUOJ 数论

    FHJ学长的心愿 原题链接,点我进去 题意 给你一个数N,让你求在\[C^{0}_{n} \ C^{1}_{n}\ C^{2}_{n}\ \dots \ C^{n}_{n}\]中有几个组合数是奇数. ...

  3. Ubantu上安装Redis

    Ubantu上安装Redis:Redis(Remote Dictionary Server):远程字典服务器,简称REDIS;Redis数据库产品用C语言编写而成,开源.少量数据存储.高速读写访问,是 ...

  4. [LeetCode] 30. 串联所有单词的子串

    题目链接: https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words/ 题目描述: 给定一个字符串 s 和一 ...

  5. 100行代码撸完SpringIOC容器

    用过Spring框架的人一定都知道Spring的依赖注入控制反转;通俗的讲就是负责实例化对象 和 管理对象间的依赖 实现解耦. 我们来对比两段代码: UserController{ UserServi ...

  6. scala学习笔记(9)

    一.高阶函数 --------------------------------------------------- 1.作为值的函数:在Scala中,函数是头等公民,就和数字一样. import s ...

  7. rabitMQ-centos7安装

    1.安装rabitMq之前需要安装Erlang cd /usr/local/ wget http://erlang.org/download/otp_src_18.3.tar.gz tar -zxvf ...

  8. 简单的物流项目实战,WPF的MVVM设计模式(三)

    往Services文件里面添加接口以及实现接口 IUserService接口 List<User> GetAllUser(); GetUserService类 ConnectToDatab ...

  9. maven多模块tomcat启动报 NoClassDefFoundError:com/test/main/message

    maven多模块tomcat启动报 NoClassDefFoundError:com/test/main/message 扫描不到 添加子模块jar包

  10. idea解除版本控制

    解除版本控制删除两个文件: 1.idea中删除vcs.xml 2.在项目文件夹中删除.git 参考:https://blog.csdn.net/qq_37999340/article/details/ ...