abc269_f Numbered Checker 题解
1.CSES 1667 Message Route 题解2.P3956 棋盘 题解3.abc233_f Swap and Sort 题解4.abc233_e Σ[k=0..10^100]floor(X/10^k) 题解5.abc233_d Interval 题解6.abc233_c Product 题解7.abc249_f Ignore Operations 题解8.abc249_d Index Trio 题解9.abc248_e K-colinear Line 题解10.abc247_f Cards 题解11.CF1066C Books Queries 题解12.P1038 神经网络 题解13.SeekLuna P1362 拓扑排序 3 题解14.abc232_e Rook Path 题解15.abc235_e MST + 1 题解16.abc234_e Arithmetic Number 题解17.P8786 李白打酒加强版 题解18.abc235_d Multiply and Rotate 题解19.CF1095D Circular Dance 题解20.P6201 & P1985 Fliptile S 题解21.CF1183C Computer Game 题解22.CF1095E Almost Regular Bracket Sequence 题解23.abc256_e Takahashi's Anguish 题解24.abc260_g Scalene Triangle Area 题解25.P8714 填空问题 题解26.abc252_d Distinct Trio 题解27.abc252_f Bread 题解28.abc253_e Distance Sequence 题解29.abc250_e Prefix Equality 题解30.abc250_d 250-like Number 题解31.arc164_a Ternary Decomposition 题解32.abc275_f Erase Subarrays 题解33.abc275_e Sugoroku 4 题解34.abc274_d Robot Arms 2 题解35.abc260_f Find 4-cycle 题解36.abc260_e At Least One 题解37.abc273_e Notebook 题解38.abc271_f XOR on Grid Path 题解39.abc271_e Subsequence Path 题解40.abc271_c Manga 题解
41.abc269_f Numbered Checker 题解
42.abc270_f Transportation 题解43.CF1077E Thematic Contests 题解44.CF1935D Exam in MAC 题解45.CF1144G Two Merged Sequences 题解46.joi2022_yo2_c 国土分割 (Land Division) 题解47.P3588 PUS 题解48.CF1946F Nobody is needed 题解Numbered Checker
题意
有一个
- 如果
是奇数,则 中的数字为 。 - 否则,
中的数字为 。
有
。 。
答案对
思路
等差数列求和。
对于每组询问
暴力时间复杂度:
推导壹
就拿第一个样例举例子。
可以很明显地发现,奇数行与偶数行排列虽然不太一样,但两者都是等差数列,且公差为
经过仔细地推导(不给推导过程,自己推去),我们可以发现:
- 对于
为奇数的情况下:- 第
行的等差数列首项为 ,项数为 。 - 第
行的等差数列首项为 ,项数为 。
- 第
- 对于
为偶数的情况下:- 第
行的等差数列首项为 ,项数为 。 - 第
行的等差数列首项为 ,项数为 。
- 第
(以上除法均需带有向下取整)。
时间复杂度:
推导贰
可以发现,行与行之间也是等差数列!公差为
令当前询问第
还是不给推导过程,答案就可以变成两个等差数列:
- 第一个:以
为首项,公差为 ,项数为 。 - 第二个:以
为首项,公差为 ,项数为 。
求出两个等差数列之和,将其加起来就是答案啦,注意取模细节。
时间复杂度:
复杂度
- 时间:
。 - 空间:
。
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; }
本文作者:wnsyou の blog
本文链接:https://www.cnblogs.com/wnsyou-blog/p/17411499.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步