首页 > 其他分享 >ABC269F 题解

ABC269F 题解

时间:2023-05-05 16:57:28浏览次数:52  
标签:tmp int 题解 ABC269F st ed id mod

前言

题目传送门!

更好的阅读体验?

题解区的方法思维难度都过大(?),提供一种极其容易的方法。

思路

题目就是求 \(\sum\limits_{i=x_1}^{x_2}\sum\limits_{j=y_1}^{y_2}a_{i,j}\)。所以很容易想到先算 \(\sum\limits_{j=y_1}^{y_2}a_{i,j}\)。

这个并不困难:

  • 如果 \(i\) 是奇数,那一行应该形如 \(x, 0, x+2, 0, x+4, 0, \cdots\) 这样子的。所以等差数列求和一下 \(x+(x+2)+(x+4)+\cdots+\text{end}\) 即可。
  • 如果 \(i\) 是偶数,那一行应该形如 \(0, x, 0, x+2, 0, x+4, \cdots\) 这样子的。同样的等差数列,只是首项末项改一下就行。

于是可以被实现为 \(f(i, l, r)\),具体见文末代码。答案就变成了 \(\sum\limits_{i=x_1}^{x_2}f(i,y_1,y_2)\)。

然后考虑如何快速计算。

发现公差固定。所以对于 \(i\) 同奇偶的那些行来说,他们的 \(f(i)\) 也是呈等差数列的。

所以随便实现一下就做完了。代码会比别的办法的代码好理解很多。注意 \(\div 2\) 使用逆元实现。

代码

#include <iostream>
#include <cstdio>
using namespace std;
const int mod = 998244353, inv = 499122177; //inv是指除以2 
int n, m;
int f(int id, int l, int r) //id行[l,r]列,总和
{
	if (id & 1) //奇数列 
	{
		int st = (l & 1) ? l : l + 1, ed = (r & 1) ? r : r - 1;
		if (st > ed) return 0;
		int cnt = (ed - st) / 2 + 1;
		int tmp = 1ll * (id - 1) * m % mod; st = (tmp + st) % mod, ed = (tmp + ed) % mod;
		return 1ll * (st + ed) * cnt % mod * inv % mod;
	}
	else //偶数列 
	{
		int st = (l & 1 ^ 1) ? l : l + 1, ed = (r & 1 ^ 1) ? r : r - 1;
		if (st > ed) return 0;
		int cnt = (ed - st) / 2 + 1;
		int tmp = 1ll * (id - 1) * m % mod; st = (tmp + st) % mod, ed = (tmp + ed) % mod;
		return 1ll * (st + ed) * cnt % mod * inv % mod;
	}
}
void solve()
{
	int x1, y1, x2, y2, ans = 0;
	scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
	//for (int i = x1; i <= x2; i++) ans = (ans + f(i, y1, y2)) % mod;
	
	int st = (x1 & 1) ? x1 : x1 + 1, ed = (x2 & 1) ? x2 : x2 - 1; //奇数行 
	if (st <= ed)
	{
		int cnt = (ed - st) / 2 + 1;
		ans += 1ll * (f(st, y1, y2) + f(ed, y1, y2)) * cnt % mod * inv % mod, ans %= mod;
	}
	st = (x1 & 1 ^ 1) ? x1 : x1 + 1, ed = (x2 & 1 ^ 1) ? x2 : x2 - 1; //偶数行 
	if (st <= ed)
	{
		int cnt = (ed - st) / 2 + 1;
		ans += 1ll * (f(st, y1, y2) + f(ed, y1, y2)) * cnt % mod * inv % mod, ans %= mod;
	}
	printf("%d\n", ans);
}
int main()
{
	int q; scanf("%d%d%d", &n, &m, &q);
	while (q--) solve();
	return 0;
}

希望能帮助到大家!

标签:tmp,int,题解,ABC269F,st,ed,id,mod
From: https://www.cnblogs.com/liangbowen/p/17374600.html

相关文章

  • LeetCode 27. 移除元素 题解
    题目链接:LeetCode27.移除元素本题大意是要对一个数组进行原地删除数值等于val的元素。双指针算法:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。快指针(p指针):寻找新数组的元素,新数组就是不含有目标元素的数组慢指针(q指针):指向更新新数组下标的位置当......
  • LeetCode 704. 二分查找 题解
    本题考查的就是一个基本的整数二分查找问题对于整数二分,有单调性一定可以二分,没有单调性的有时候也可以二分。算法思想(分为两种方法):查找结果是在左边区间的情况区间被划分为[l,mid]和[mid+1,r]1、确定分界点,mid=q[(l+r)/2]2、判断是否满足是:区间变成[l,mid]因此:r=mid否......
  • 洛谷P4824题解
    题面题意:给出字符串s和t,每次操作将s中出现的第一个t删去,直到不能删为止。求最后的串。|s|<=1e6题解:hash做法。(此题也有kmp和权值线段树做法)因为涉及到删除操作,所以我们要动态的实现这个过程。所以考虑开一个栈来存储当前留下的字符。然后每有一个字符入栈,就拿当前......
  • Linux IMX6ULL RTC掉电不保存问题解决
    背景:公司临时派发的小任务,解决项目中RTC实时时钟的问题,在为解决这个问题之前,项目的实时时钟老是一断电重启就会出现出现恢复到一个固定的时间。琢磨了许久,终于解决了,特此记录一下,给读者如遇到相关问题提供一下思路拓展。平台:imx6ull开发板加Linux系统。解决步骤:1.删除Linux......
  • CWOI 2023.05.04 题解
    mzx的动态规划杂题选讲。stoARC153D-SumofSumofDigitsP7152[USACO20DEC]BovineGeneticsGCF1542E2AbnormalPermutationPairs(hardversion)题意给定\(n,m\),求有多少对长度为\(n\)的排列\(p,q\),满足以下条件:\(p\)的字典序小于\(q\);\(p\)的逆序对......
  • 洛谷P7469题解
    题面题意:有两个字符串a和b,问b中有多少个本质不同子串可以由a删除若干个字符得到。|a|,|b|<=3000题解:字典树(这个题做法很多,后补)。把字符串b的每个子串打到字典树上。然后因为3000^2*26这个东西比较大,所以不能用nxt[id][26]来存储,于是使用链式前向星存图,这样tri......
  • 问题解答 | FMCW TDMA-MIMO毫米波雷达信号处理仿真
    本文编辑:@调皮连续波,保持关注调皮哥,获得更多雷达学习资料和建议!大家好,我是调皮哥,今天继续给大家分享干货,助力大家轻松、快乐、有方向地学习雷达。之前分享的文章:雷达仿真|FMCWTDMA-MIMO毫米波雷达信号处理仿真(可修改为DDMA-MIMO)当中,存在几个小问题(bug),具体如下:第十节:多普勒补偿”......
  • 关于容斥原理 / P5505题解
    发现很多题解连容斥原理的“钦定”和“至少”的区别都讲不清楚,误导萌新,所以写一下这两个东西的区别“钦定”这个东西是会算重的,而“至少”不会。举个例子吧,比如\(1\2\3\)三个位置不合法,如果我说“钦定”两个位置不合法,那么这里计算方案的时候这个不合法的方案会被计算三次,分......
  • [JOI 2016 Final]断层 题解
    题目链接首先发现斜着平移比较难处理,所以考虑将平面逆时针旋转\(45°\)。接着发现风化也不好处理,但是风化的一定不会作为答案,所以我们可以离线,然后倒着处理操作,上升变为下降。我们发现每个初始\(0\)点最后的坐标就是它正着做时初始的坐标,且每次操作都只会将连续一段点的\(......
  • 【23.05.03】好题题解
    好题题解A题目大意:计算一个项数为\(n\)的多项式除以\(x^3-x\)的余数多项式。数据范围:对于\(100\%\)的数据:\(2\leqn\leq2\times10^5\)解题分析:水题,直接多项式除法模拟即可。需要注意细节。ACCode:#include<bits/stdc++.h>usingnamespacestd;#d......