首页 > 其他分享 >abc269_f Numbered Checker 题解

abc269_f Numbered Checker 题解

时间:2023-05-18 11:56:52浏览次数:43  
标签:Numbered frac 题解 ll times Checker 项数 Sum 等差数列

Numbered Checker

题意

有一个 \(n\times m\) 的方格矩阵,左上角是 \((1,1)\),右下角是 \((n,m)\),每个方格中都有一个整数,其中 \((x,y)\) 中的数字为:

  • 如果 \(x+y\) 是奇数,则 \((x,y)\) 中的数字为 \(0\)。
  • 否则,\((x,y)\) 中的数字为 \((x-1)\times m + y\)。

有 \(Q\) 组询问,每组询问给定四个整数 \(a,b,c,d\),求所有满足要求的 \((i,j)\) 中的数字之和:

  • \(a \leqslant i \leqslant b\)。
  • \(c \leqslant j \leqslant d\)。

答案对 \(998244353\) 取模。

思路

等差数列求和。

对于每组询问

暴力时间复杂度:\(O(n\times m)\),爆炸。

推导壹

就拿第一个样例举例子。

可以很明显地发现,奇数行与偶数行排列虽然不太一样,但两者都是等差数列且公差为 \(2\)。

经过仔细地推导(不给推导过程,自己推去),我们可以发现:

  • 对于 \(a+c\) 为奇数的情况下:
    • 第 \(a\) 行的等差数列首项为 \((a,c+1)\),项数为 \(\frac{d-c+1}{2}\)。
    • 第 \(a+1\) 行的等差数列首项为 \((a+1,c)\),项数为 \(1+\frac{d-c}{2}\)。
  • 对于 \(a+c\)​ 为偶数的情况下:
    • 第 \(a\) 行的等差数列首项为 \((a,c)\),项数为 \(\frac{d-c}{2}+1\)。
    • 第 \(a+1\) 行的等差数列首项为 \((a+1,c+1)\),项数为 \(\frac{d-c+1}{2}\)。

(以上除法均需带有向下取整)。

时间复杂度:\(O(n)\),还是不够优秀。

推导贰

可以发现,行与行之间也是等差数列!公差为 \(2m\)。

令当前询问第 \(a\) 行的等差数列之和为 \(sum\),项数为 \(p\);第 \(a+1\) 行的等差数列之和为 \(num\),项数为 \(q\)。

还是不给推导过程,答案就可以变成两个等差数列:

  • 第一个:以 \(sum\) 为首项,公差为 \(2\times m\times p\),项数为 \(\frac{b-a}{2}+1\)。
  • 第二个:以 \(num\) 为首项,公差为 \(2\times m\times q\),项数为 \(\frac{b-a+1}{2}\)。

求出两个等差数列之和,将其加起来就是答案啦,注意取模细节。

时间复杂度:\(O(1)\)。

复杂度

  • 时间:\(O(Q)\)。
  • 空间:\(O(1)\)。

Code

#include <iostream>

using namespace std;
using ll = long long;

const int mod = 998244353;

ll n, m, t, a, b, c, d, p, q, sum, num;

ll id (ll x, ll y) { // 将坐标转数值
  return ((x - 1) * m + y) % mod;
}

ll Sum (ll s, ll d, ll n) { // 等差数列求和公式
  return (s * n + n * (n - 1) / 2 % mod * d % mod) % mod;
}

int main () {
  ios::sync_with_stdio(0), cin.tie(0);
  for (cin >> n >> m >> t; t; t--) {
    cin >> a >> b >> c >> d;
    p = (d - c + 1) / 2, q = (d - c) / 2 + 1;
    if ((a + c) % 2) {
      sum = Sum(id(a, c + 1), 2, p), num = Sum(id(a + 1, c), 2, q); // 套用公式
    } else {
      swap(p, q);
      sum = Sum(id(a, c), 2, p), num = Sum(id(a + 1, c + 1), 2, q);
    }
    cout << (Sum(sum, 2 * m * p % mod, (b - a) / 2 + 1) + Sum(num, 2 * m * q % mod, (b - a + 1) / 2)) % mod << '\n'; // 各种取模细节
  }
  return 0;
}

标签:Numbered,frac,题解,ll,times,Checker,项数,Sum,等差数列
From: https://www.cnblogs.com/lw0-blog/p/17411499.html

相关文章

  • CSP-J2022试题题解
    1.乘方原题:https://www.luogu.com.cn/problem/P8813代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintXN=1e9;lla,b,ans=1;intmain(){ cin>>a>>b; for(inti=1;i<=b;i++){ ans*=a; if(ans>XN){ cout......
  • abc270_f Transportation 题解
    Transportation题意有\(n\)个城市,你可以执行以下操作若干次:选择一个没有建机场的城市\(i\),花费\(x_i\)建一个机场。选择一个没有建港口的城市\(i\),花费\(y_i\)建一个港口。还有\(m\)条没有修建的道路,第\(i\)条道路双向连接\(a_i\)和\(b_i\),修建这条道路需要......
  • [ABC269F] Numbered Checker
    [ABC269F]NumberedChecker题意有一个\(n\timesm\)的矩阵,有:\(a_{ij}=\begin{cases}(i-1)m+j&i+j\equiv0\pmod{2}\\0&i+j\equiv1\pmod{2}\end{cases}\)给定\(a,b,c,d\)问从\((a,c)\)到\((b,d)\)的数字和是多少。思路数学,我们可以发现,每一行可以表......
  • CF1077E Thematic Contests 题解
    ThematicContests题意有\(n\)个问题,每个问题有一个分类\(a_i\)。现在要举办一些比赛,要求:一场比赛中所有题目的分类相同。所有比赛的分类是互不相同的。第一场比赛的题目数量任意,但从第二场开始,每一场比赛的题目数量都必须是前一场的两倍。求所有比赛的题目数量之和的......
  • abc235_d Multiply and Rotate 题解
    MultiplyandRotate题意给定两个整数\(a\)和\(n\),有一个整数\(x\),初始值为\(1\),有两种操作:将\(x\)变成\(x\timesa\)。在\(x>10\)且\(x\)不是十的倍数的情况下可以执行此操作:将\(x\)当成一个字符串,将其循环右移一次。求最少执行多少次操作能把\(x\)变......
  • P8786 李白打酒加强版 题解
    李白打酒加强版题目大意一开始酒显里有\(2\)斗酒,每遇到一次店就会把酒显里的酒数量(单位:斗)乘\(2\),每遇到一次花就把酒显里的酒喝掉\(1\)斗。这一路上一共遇到店\(n\)次,遇到花\(m\)次,且最后一次遇到的是花,酒显里没有一斗酒了。计算这一路上遇到店和花的顺序总共有......
  • YACS 2023年5月月赛 甲组 T1 子集和(六) 题解
    YACS老师说这是道分治,但就不告诉我怎么做,我硬是用线段树卡了过去...特别解气的是把AC图片发了过去(我就是在YACS上的编程课)莫队好了说点正经的,看到是谁谁谁的倍数就能想到DP,状态设计也很水啦!设f[i]为当前考虑到的区间内,子集和%k=i的数量。新加入一个元素时,循环0~......
  • CF1183C Computer Game 题解
    ComputerGame还算水的一道题。题意本题意为题面直接翻译的简化版,可能会比题目翻译要复杂。有\(q\)次询问,每次给出四个数,表示一开始的电亮为\(k\),有\(n\)个回合,不插电玩一个回合则电量会减少\(a\),插电玩一个回合则电量会减少\(b\),电量在任何时刻都必须严格大于\(0\)......
  • Plsql或Navicat连接登陆Oracle时慢、执行语句的时候也特别慢的问题解决方案
    用Plsql或Navicat连接登陆Oracle时,等待时间特别长。经过漫长的等待后,执行语句的时候也特别慢,监听配置没毛病的情况下,大概率是监听日志文件过大导致的。监听日志路径:app\Administrator\diag\tnslsnr\LS--20171012URU\listener\trace\listener.log删除listener.log文件即可。......
  • 交通运输(Wormhole Transportaion) 题解
    传送门交通运输(WormholeTransportaion)题目大意有\(n\)个点和\(m\)个点对,你需要构造一张\(m-1\)条边的无向图,使得\(m\)个点对间最短路之和最小。求最小值及取到最小值的方案数。\(2\len\le2000,2\lenm\le2\times10^7,1\leu_i,v_i\len,u_i\neqv_i\)。......