子矩阵求和

http://hihocoder.com/discuss/question/3005

声明一下:

n是和x一起的,m是和y一起的

x是横着的,y是纵着的,x往右为正,y往下为正

(非常反常规的定义)

性质好题

看起来无从下手。

两个关键性质:

证明挺显然的。画画图

同余方程exgcd即可

子矩阵和?

先算出(0,0)的,每次平移,加减一行一列前n或m个,

细节:

1.纵向要循环到n,横向循环到m

2.注意开long long

3.反常规的设定真讨厌

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
// #define int long long
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
il int ad(int x,int y){return x+y>=mod?x+y-mod:x+y;}
il int sub(int x,int y){return ad(x,mod-y);}
il int mul(int x,int y){return (ll)x*y%mod;}
il void inc(int &x,int y){x=ad(x,y);}
il void inc2(int &x,int y){x=mul(x,y);}
il int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
// using namespace Modulo;
namespace Miracle{
ll n,m,P;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=;y=;return a;
}
ll ret=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return ret;
}
ll ch(ll x){
if(m<=x) return m*(m+)/;
return x*(x+)/+(m-x)*x;
}
ll cl(ll y){
if(n<=y) return n*(n+)/;
return y*(y+)/+(n-y)*y;
}
// ll calc()
ll ax,ay;
int main(){
int t;rd(t);
while(t--){
rd(n);rd(m);rd(P);
swap(n,m);
ax=;ay=; ll S=;
for(reg d=;d<=min(n,m);++d){
S+=(ll)d*(+m-d+n-d);
}
ll ns=S;
ll s0=n*m;
ll k,x,g;
g=exgcd(s0,P,x,k);
x=(x%(P/g)+(P/g))%(P/g); for(reg i=;i<=m;++i){
ll tmp=P-(ns%P);
// cout<<" ii -------- "<<i<<" : "<<ns<<endl;
if(tmp%g==){
ll nx=x*(tmp/g);
nx=(nx%(P/g)+(P/g))%(P/g);
ll tx=+nx,ty=i+nx;
// cout<<" tx "<<tx<<" ty "<<ty<<" : "<<ns+nx*s0<<endl;
if(!ax||(ax+ay>tx+ty)||((ax+ay==tx+ty)&&(tx<ax))){
ax=tx;ay=ty;
}
}
ns-=ch(i);
ns+=ch(i+n);
} ns=S;
for(reg j=;j<=n;++j){
ll tmp=P-(ns%P);
// cout<<" J ----------"<<j<<" ns "<<ns<<endl;
if(tmp%g==){
ll nx=x*(tmp/g);
nx=(nx%(P/g)+(P/g))%(P/g);
ll tx=j+nx,ty=+nx;
// cout<<" tx "<<tx<<" ty "<<ty<<" : "<<ns+nx*s0<<endl;
if(!ax||(ax+ay>tx+ty)||((ax+ay==tx+ty)&&(tx<ax))){
ax=tx;ay=ty;
}
}
ns-=cl(j);
ns+=cl(j+m);
}
if(!ax){
puts("-1");
}else{
printf("%lld %lld\n",ax,ay);
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/

矩阵非常对称,

这个性质挖的好啊。

然后就比较简单了。

hihoCoder [Offer收割]编程练习赛3 D子矩阵求和的更多相关文章

  1. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  2. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  3. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  4. hihocoder offer收割编程练习赛8 C 数组分拆

    思路:(引自bfsoyc的回答:http://hihocoder.com/discuss/question/4160) 动态规划.状态dp[i]表示 前i个数的合法的方案数,转移是 dp[i] = s ...

  5. [hihocoder][Offer收割]编程练习赛44

    扫雷游戏 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #includ ...

  6. hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

    题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x ...

  7. hihocoder [Offer收割]编程练习赛52 D 部门聚会

    看了题目的讨论才会做的 首先一点,算每条边(u, v)对于n*(n+1)/2种[l, r]组合的贡献 正着算不如反着算 哪些[l, r]的组合没有包含这条边(u, v)呢 这个很好算 只需要统计u这半 ...

  8. hihocoder [Offer收割]编程练习赛14

    A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...

  9. hihocoder [Offer收割]编程练习赛8

    第一次做这种比赛,被自己坑的好惨... A.这道题的关键其实是如果有k和n满足kD+F>nL>kD则不能走无限远,分支看似难整理,其实比较简单,F>L根本就不用算了,明摆着就是Bsi ...

随机推荐

  1. MySQL图形化管理工具之Navicat安装以及激活

    软件以及激活包下载地址 1. 安装navicat 双击navicat_trial_11.1.20.0.1449226634.exe,一路下一步安装(记住安装目录) 2. 激活 双击PatchNavic ...

  2. JVM 和JMM的区别

    首先从定义上看 JVM (Java Virtual Machine)Java虚拟机模型 主要描述的是Java虚拟机内部的结构以及各个结构之间的关系. JMM(Java Memory Model) Ja ...

  3. 自己总结的CSS3中transform变换、transition过渡、animation动画的基本用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  4. delphi 动态获取文件类型的图标

    delphi 动态获取文件类型的图标.txt我不奢望什么,只希望你以后的女人一个不如一个.真怀念小时候啊,天热的时候我也可以像男人一样光膀子!在应用程序的编写中,组合框(ComboBox).列表框(L ...

  5. vue2 — vuex状态管理

    一.为什么使用vuex : https://www.cnblogs.com/goloving/p/9080005.html vuex的功能 和 localstorage 的作用是一样,把数据在一个所有 ...

  6. 【已转移】【缓存与性能优化】一篇文章搞掂:Redis

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 一.什么是Redis 全称: Remote Dictionary Server 远程字典服务器 实质: 一个缓存结构服务器或数据结 ...

  7. MySQL 关于case when结合group by用时的写法举例

    原表是个员工档案,共583人,但case when结合group by用时,写法不同,其出来的结果也不同 例1: select distinct a.Branch,case when kultur = ...

  8. seleniumIDE command命令

    语法组成要素:command.target.value. command命令 三大类型:(action.Accessor.assertion)   操作  存储  断言 操作类型——Action 浏览 ...

  9. vue事件修饰符(once:prev:stop)

    vue事件修饰符(once:prev:stop) stop修饰符  效果如下: 当你鼠标在这个div里的时候,x与y的值:会随着鼠标的变化而变化.但是当鼠标放在stopMoving的时候,x与y的值是 ...

  10. PAT甲级——A1141 PATRankingofInstitution【25】

    A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the ...