子矩阵求和

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. px4的CMakelists.txt阅读

    ############################################################################ # # Copyright (c) PX4 D ...

  2. 第六周-Scrum Meeting

    第一部分ScrumMeeting 每个人的工作: 成员 任务 ISSUE链接 本周已完成的工作 本周计划完成的工作 工作中遇到的困难 李卓峻 负责商品信息页面的界面设计与功能实现 https://gi ...

  3. kubernetes批量删除pod

    监控页面出现看到有运行失败的pod 1) 查看有哪些不运行的podcustom-metrics-apiserver日志占满空间被驱逐 [root@hadoop03 ~]# kubectl get po ...

  4. 【数据库】一篇文章搞掂:SQL Server数据库

    问题: 1.同一段代码,在存储过程中运行比普通SQL执行速度慢几十倍 原理: 在SQL Server中有一个叫做 “Parameter sniffing”参数嗅探的特性.SQL Server在存储过程 ...

  5. leetcode上回溯法的使用

    17 93 131 46(全排列) class Solution { public: vector<vector<int>> permute(vector<int> ...

  6. javsscript闭包的一种使用场景--沙箱

    ​ //沙箱:模块化,沙箱是一个隔离的环境,最大的好处就是避免全局变量的污染. var model = (function () {//一个匿名的立即执行函数 var price = 900;//这是 ...

  7. Tomcat 配置安装

    1 下载和安装Tomcat服务器 Tomcat官方站点:http://jakarta.apache.org 下载Tomcat安装程序包:http://tomcat.apache.org/ 启动和测试T ...

  8. linux 杂七杂八

    一."init"是内核启动的第一个用户空间程序(PID=1),也是所有用户态进程的"大总管":所有内核态进程的大总管是PID=2的[kthreadd]: 二.v ...

  9. java 重新学习 (五)

    Set 集合 一.HashSet按照Hash算法存储集合元素(hashCode方法获取hashCode值,根据hashCode值获取元素位置,通过equals判断对象是否相等并且hashCode值是否 ...

  10. Python-02 生成器表达式,列表推导式

    列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for  变量i  in 可迭代的数据类型 ] 列表 ...