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)\)即可。

代码

  1. #include<bits/stdc++.h>
  2. #define N 200009
  3. using namespace std;
  4. typedef long long ll;
  5. ll n,m,k;
  6. ll dp[N];
  7. inline ll rd(){
  8. ll x=0;char c=getchar();bool f=0;
  9. while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
  10. while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
  11. return f?-x:x;
  12. }
  13. struct node{
  14. int x,y;
  15. inline bool operator <(const node &b)const{
  16. if(x+y!=b.x+b.y)return x+y<b.x+b.y;
  17. return x<b.x;
  18. }
  19. }ans;
  20. inline ll Sum(ll n){return n*(n+1)/2;}
  21. inline ll sum(ll n,ll m){
  22. if(!n||!m)return 0;
  23. if(n>m)swap(n,m);
  24. return dp[n]*2-Sum(n)+(m-n)*Sum(n);
  25. }
  26. inline ll calc(ll x,ll y,ll n,ll m){
  27. 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);
  28. }
  29. inline void prework(ll n){
  30. for(int i=1;i<=n;++i)dp[i]=dp[i-1]+1ll*i*(i+1)/2;
  31. }
  32. ll xx,yy,g;
  33. ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
  34. void exgcd(ll a,ll b){
  35. if(!b){
  36. xx=1;yy=0;
  37. return;
  38. }
  39. exgcd(b,a%b);
  40. ll k=xx;
  41. xx=yy;
  42. yy=k-(a/b)*yy;
  43. }
  44. inline int solve(ll x,ll y,ll k){
  45. x%=k;y%=k;
  46. x=k-x;
  47. if(x%g)return -1;
  48. ll o=(xx*(x/g)%(k/g)+(k/g))%(k/g);
  49. return o;
  50. }
  51. int main(){
  52. int Q=rd();
  53. prework(200000);
  54. while(Q--){
  55. n=rd();m=rd();k=rd();
  56. g=gcd(1ll*n*m%k,k);
  57. exgcd(1ll*n*m%k,k);/
  58. bool tag=0;
  59. int aa=1e9;
  60. ans=node{aa,aa};
  61. for(int i=1;i<=n;++i){
  62. int x=solve(calc(1,i,n,m),1ll*n*m,k);
  63. if(x!=-1){
  64. tag=1;
  65. node du=node{1+x,i+x};
  66. if(du<ans)ans=du;
  67. }
  68. }
  69. for(int i=1;i<=m;++i){
  70. int x=solve(calc(i,1,n,m),1ll*n*m,k);
  71. if(x!=-1){
  72. tag=1;
  73. node du=node{i+x,1+x};
  74. if(du<ans)ans=du;;
  75. }
  76. }
  77. if(tag){
  78. printf("%d %d\n",ans.x,ans.y);
  79. }
  80. else puts("-1");
  81. }
  82. return 0;
  83. }

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. Linux0.11之初识Makefile/build.c

    前言 Makefile对于从来没有接触过的人来说是相当别扭的(比如我),但它确实又是非常重要的,它描述了一个Image是如何形成的,理解它也许并不能帮我解决实际问题,而且编写Makefile的工作也许 ...

  2. Tarjan水题系列(4):HAOI2010 软件安装

    题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi​的磁盘空间,它的价值为Vi​.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi​的和最大). ...

  3. [LeetCode] 203. 移除链表元素

    题目链接:https://leetcode-cn.com/problems/remove-linked-list-elements/ 题目描述: 删除链表中等于给定值 val 的所有节点. 示例: 输 ...

  4. T-聊天止于呵呵

    (现代版)俗话说:流言止于智者,聊天止于呵呵.输入一段聊天记录,你的任务是数一数有 多少段对话“止于呵呵”,即对话的最后一句话包含单词 hehe 或者它的变形. 具体来说,我们首先提取出对话的最后一句 ...

  5. win10无法开启网络发现怎么办 如何启用网络发现

    鼠标右键点击桌面左下角的开始按钮,在弹出的菜单中选择“运行”菜单项.   在打开的Windows10运行窗口中,输入Services.msc,然后点击确定按钮.   在打开的Windows10服务窗口 ...

  6. Vue-Quill-Editor 富文本编辑器

    通俗来说:富文本,就是比较丰富的文本编辑器.普通的框只能输入文字,而富文本还能给文字加颜色样式等. 富文本编辑器有很多,例如:KindEditor.Ueditor.但并不原生支持vue 但是我们今天要 ...

  7. MongoDB入门_MongoDB特色

    1. sql数据库与nosql数据库对比 nosql不支持实时一致性转而支持数据的最终一致性,数据有一定的延迟 redis数据库支持部分事物,而mongodb不支持事物 nosql数据库没有多表联查功 ...

  8. RK3288之kernel目录结构以及功能

    :~/RK3288/kernel$ ls android include MAINTAINERS security arch init Makefile sound backported-featur ...

  9. libevent 网络库安装

    ./configure prefix=/tools/libevent make sudo make install

  10. GNU ARM eclipse 安装--Linux 版本

    官方网站:https://gnu-mcu-eclipse.github.io/ 1. 工具链安装 1.1 xpm 安装 安装 nodejs: sudo apt-get install nodejs s ...