CF 963A Alternating Sum

2023-05-16

          • 传送门
          • 思路
          • 参考代码

传送门
思路

  唉,我太弱了,什么都不会,好不容易做得来一道题,还是 A 题(所以不要瞧不起 A 题),结果还写错了(不知道为什么恰好在某个地方少写了个求余),唉,我太弱啦!

  显然对于第 i(i1) i ( i ≥ 1 ) 个求和项来说,有:

cnti=cnti1×ba c n t i = c n t i − 1 × b a

  我们先假设 kn k ≈ n 。显然我们可以将 cnti,cnti+k,cnti+2k, c n t i , c n t i + k , c n t i + 2 k , ⋯ 合在一起算,因为它们的符号相同。这样我们只需要算 nk n k 次就算出来了,时间复杂度为 O(k+nk)O(n) O ( k + n k ) ≈ O ( n )

  现在 k k 很小怎么办?我们只需要强行把那个序列变长,这样就能在根号时间内算出来了。最后可能还剩了一点无法对齐,直接计算即可,其长度不会超过新的序列的长,即 O(n)。因此算法的整体时间复杂度为 O(n) O ( n )

参考代码
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cassert>
#include <cctype>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <functional>
typedef long long LL;
typedef unsigned long long ULL;
using std::cin;
using std::cout;
using std::endl;
typedef int INT_PUT;
INT_PUT readIn()
{
    INT_PUT a = 0; bool positive = true;
    char ch = getchar();
    while (!(ch == '-' || std::isdigit(ch))) ch = getchar();
    if (ch == '-') { positive = false; ch = getchar(); }
    while (std::isdigit(ch)) { a = a * 10 - (ch - '0'); ch = getchar(); }
    return positive ? -a : a;
}
void printOut(INT_PUT x)
{
    char buffer[20]; int length = 0;
    if (x < 0) putchar('-'); else x = -x;
    do buffer[length++] = -(x % 10) + '0'; while (x /= 10);
    do putchar(buffer[--length]); while (length);
}

const int mod = int(1e9) + 9;
const int maxn = int(1e5) + 5;
int n, a, b, k;
char seq[maxn];

LL power(LL x, int y)
{
    LL ret = 1;
    while (y)
    {
        if (y & 1) ret = ret * x % mod;
        x = x * x % mod;
        y >>= 1;
    }
    return ret;
}

void run()
{
    n = readIn();
    a = readIn();
    b = readIn();
    k = readIn();
    for (int i = 0; i < k; i++)
    {
        char ch = getchar();
        while (ch != '+' && ch != '-')
            ch = getchar();
        seq[i] = ch;
    }
    int sqrtN = std::sqrt(n);
    int ratio = std::max<double>(1, (double)sqrtN / k);

    int block = k * ratio;
    int times = (n + 1) / block;
    int remain = (n + 1) - block * times;

    LL inva = power(a, mod - 2);
    LL pwrinva = power(inva, block);
    LL pwrb = power(b, block);
    LL cntA = power(a, n), cntB = 1;
    LL cnt = 0;
    for (int i = 0; i < times; i++)
    {
        cnt = (cnt + cntA * cntB) % mod;
        cntA = cntA * pwrinva % mod;
        cntB = cntB * pwrb % mod;
    }
    LL factor = inva * b % mod;
    LL ans = 0;
    for (int i = 0; i < block; i++)
    {
        ans += cnt * (seq[i % k] == '-' ? -1 : 1) + mod;
        ans %= mod;
        cnt = cnt * factor % mod;
    }
    if (remain)
    {
        cnt = power(a, n - block * times) * power(b, block * times) % mod;
        for (int i = 0; i < remain; i++)
        {
            ans += cnt * (seq[i % k] == '-' ? -1 : 1) + mod;
            ans %= mod;
            cnt = cnt * factor % mod;
        }
    }
    printOut(ans);
}

int main()
{
    run();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CF 963A Alternating Sum 的相关文章

  • 总和可为 null 的 Linq 查询

    from i in Db Items select new VotedItem ItemId i ItemId Points from v in Db Votes where b ItemId v ItemId select v Point
  • MySQL JOIN 与多个表和 SUMS

    我正在尝试创建一个查询 该查询将从我正在创建的计费系统的四个表中获取信息 我有以下表格 表发票 InvoiceID PK ClientID Date Status 桌面客户端 ClientID PK ClientName 表发票项目 Ite
  • SQL不是单组组函数

    当我运行以下 SQL 语句时 SELECT MAX SUM TIME FROM downloads GROUP BY SSN 它返回客户下载的最大总价值 但是如果我尝试通过将其添加到 select 语句来查找该最大值所属的社会安全号码 SE
  • 如何求和两个对象的属性?

    我有多个 JavaScript 对象 a 12 b 8 c 17 and a 2 b 4 c 1 我需要通过键对这两个对象求和 Result a 14 b 12 c 18 你有 JavaScript 的解决方案吗 我用Object keys
  • 在 numpy 中查找对角线和(更快)

    我有一些board像这样的 numpy 数组 array 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0
  • 每个日期的 SQL 总金额

    我有一个名为 rentals 的表 其中存储如下数据 id rent id start date end date amount 1 54 12 10 2019 26 10 2019 100 2 54 13 10 2019 20 10 20
  • MATLAB中对矩阵元素求和的方法有哪些?

    给定矩阵 A 1 2 3 4 5 6 7 8 9 如何使用 for 循环来计算矩阵中元素的总和 使用该函数编写一行 MATLAB 命令sum求和 矩阵元素在A 我的答案 1 for j 1 3 for i j 3 A i A i A j 1
  • 为什么 sum() 查询返回的结果带有更多小数点?

    上图显示了我的数据库表中名为 igstAmt 的列之一 当我使用查询时 SELECT sum igstAmt as igstAmt FROM salesinvoice 它返回值21616 7500129491有很多小数点 但正确答案是216
  • 对 BigIntegers 列表求和

    我已经查看了所有内容 但无法弄清楚这一点 如何对 BigIntegers 列表求和 Using System Numerics Using System Linq List
  • Python对二维列表中具有相同第一个值的元素求和

    我正在尝试找到一种有效的方法来执行以下操作 我有这个样本 sample no 2 6 ja 5 7 no 4 9 ja 10 11 ap 7 12 并且需要 res no 6 15 ja 15 18 ap 7 12 即对第一个元素相同的子列
  • 汇总分钟到小时的需求

    我不知道我是否在这个问题的正确部分 我环顾四周并没有找到答案 所以这是我的问题 我有一个 CSV 文件 订购如下 dat lt read csv text Date Demand 01 01 2012 00 00 00 5061 5 01
  • 集合中项目的总和

    使用 LINQ to SQL 我有一个包含 OrderDetails 集合的 Order 类 订单详细信息有一个名为 LineTotal 的属性 它获取 Qnty x ItemPrice 我知道如何对数据库进行新的 LINQ 查询来查找订单
  • MySQL SUM 多列

    我还有一个关于总和的问题 我想对一支棒球队的得分进行求和 将作为本地球员打球时的得分与作为访客打球时的得分相加 匹配表是这样的 Baseball matches Id IdTeamHome IdTeamAway ScoreHome Scor
  • 如何按 DATE_FORMAT(date,'%Y-%m-%d') 限制 20 对值求和,如果大于 20,则对剩余值求和?

    如何求和DATE FORMAT date Y m d id 前 20 行数据 如果大于 20 则对剩余值求和 否则为 0 假设我有以下数据和以下 SQL 该怎么做 非常感谢您的任何建议 SELECT SUM value id DATE FO
  • 计数累计和

    我想知道是否可以对计数进行累积和 我想举的一个例子是今年影响美国的风暴 我想要一个列出 2014 年月份的结果集 以及该月之前影响美国的风暴累计总数 我希望得到 3 列的内容 Month NumberofStorms 和 Cumulativ
  • jQuery:如何用逗号对一列数字求和?

    我使用了网上找到的以下功能 效果非常好 然而 当我的用户后来要求在数字中包含逗号时 它就崩溃了 它仅添加逗号前面的数字 这是函数 function sumOfColumns tableID columnIndex hasHeader var
  • 当我加入第二个表时总和不正确

    这是我第一次请求你的帮助 实际上我必须创建一个查询 并为其做了一个类似的示例 我有两张桌子 Report ReportID Date headCount Production ProdID ReportID Quantity 我的问题是使用
  • Python中基于行输入的条件求和

    我正在尝试用Python 做一个条件和积 简化的思路如下 A 1 1 2 3 3 3 B 0 50 0 25 0 99 0 80 0 70 0 20 我想要作为输出 Total1 0 50 1 0 25 1 Total2 0 99 2 To
  • 添加零时奇怪的 numpy.sum 行为

    我了解数学上等效的算术运算如何因数值错误而导致不同的结果 例如 以不同的顺序对浮点数求和 然而 令我惊讶的是添加零sum可以改变结果 我认为无论如何 这始终适用于浮动 x 0 x 这是一个例子 我预计所有的线都恰好为零 有人可以解释为什么会
  • 当达到最小起订量时,如何重置 Google 表格中的运行总计?

    请提供数组公式 当达到最小起订量时 您可以帮助重置运行总计吗 这里最小起订量 15 当运行总计等于或大于 15 时 应重新启动 Date Value Desired 12 2022 6 6 01 2023 5 11 02 2023 4 15

随机推荐

  • CF 713C Sonya and Problem Wihtout a Legend

    文章目录 传送门题目大意正解通过维护关键点来维护信息参考代码 传送门 题目大意 给定一个长度为 n n 3000
  • Luogu 3642 [APIO 2016] 烟火表演

    传送门引例 xff08 上一道题 xff09 凸函数一开始的思路正解参考代码总结 传送门 引例 xff08 上一道题 xff09 凸函数 回忆我们上一道题是怎么做的 我们维护的东西的实质是一个 xff08 下 xff09 凸函数 由于我们的
  • Luogu 3631 [APIO 2011] 方格染色

    传送门思路参考代码细节 传送门 思路 很不错的一道题 xff0c 用到的东西不深 xff0c 但是要想到确实需要一定思维 一开始我想的是动态规划 xff0c 发现如果要设状态需要知道一个格子左边 xff0c 上边和左上边三个格子的状态 然后
  • Luogu 3632 [APIO 2011] 寻路

    传送门正解参考代码 传送门 正解 暴力连边跑最短路就好了 xff0c 只不过代码太长太难写啦 xff01 参考代码 span class hljs preprocessor include lt cstdio gt span span cl
  • Luogu 3634 [APIO 2012] 守卫

    传送门思路正解参考代码 传送门 思路 感觉自己越来越笨了 首先 xff0c 很明显这道题需要把没有看到忍者的区间给删去 xff0c 可以用前缀和 O n O n 处理 xff0c 然后对没有删去的地方重新标号 重新标号时 xff0c 需要对
  • Luogu 1552 [APIO 2012] 派遣

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题读错了两次 xff0c 一开始读成了一个一般的背包 xff0c 然后读成了一个价值和花费相同的背包 xff0c 最后才发现原来是一个价值为 1
  • 贪玩 CF 之旅

    文章目录 CF 7D Palindrome Degree http codeforces com problemset problem 7 D 题解 CF 713C Sonya and Problem Wihtout a Legend ht
  • Luogu 3638 [APIO 2013] 机器人

    传送门思路正解参考代码关于 SPFA 传送门 思路 n n 这么小 会不会是搜索题 稍有经验的我直接否定了这个结论 仔细读题并分析样例 发现原来一个位置可以有多个机器人 且机器人行走的时候无视其它机器人 那这个就是一张图啊 可以将这张图预处
  • Luogu 3647 [APIO 2014] 连珠线

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 又看错题了 题目中说一个新的珠子和一个已经添加的珠子连接起来 xff0c 我没有看到 xff0c 然后就凉了 立个 flag xff1a 已经连续看错五题了 xff0c
  • 【转】mingw64的安装方法

    转自 xff1a http write blog csdn net postlist mingw64的安装方法 1 下载ming w64 http sourceforge net projects mingw w64 files or x8
  • Luogu 3645 [APIO 2015] 雅加达的摩天楼

    传送门思路正解参考代码Update 传送门 思路 唉 xff0c 我太弱了 xff0c 我都看出来要分块了 xff0c 就是做不来 不过终于把题读对了 先来看子任务三怎么做 显然可以有一个 O m 2 O m 2
  • Luogu 3644 [APIO 2015] 八邻旁之桥

    传送门思路当 k 61 2 时参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题也做不来 很明显这道题先要把不过河的人排除了 xff0c 剩下的都是要过河的 当 k 61 1 k 61 1 时 xff0
  • Luogu 3646 [APIO 2015] 巴厘岛的雕塑

    传送门总结 APIO 2015思路参考代码总结 传送门 总结 APIO 2015 争取今天做完一套 QAQ T1 我最多之能想到从高位向低位做 xff0c 然后就完全不会了 xff1b T2 我想到了分情况讨论 xff0c 但是没有建图成功
  • UOJ 2016 [APIO 2016] Gap

    传送门思路参考代码交互题 交互题大致形式Windows 平台下 xff08 Dev C 43 43 xff09 Ubuntu 平台下 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题也做不来 这道题简直就是利用
  • CF 940F Machine Learning

    传送门题目大意思路参考代码Remarks 传送门 题目大意 给你一个数组 a 1 n n 10 5 a 1 n
  • CF 976D Degree Set

    传送门题目大意思路参考代码总结 传送门 题目大意 给你一个长度为 n n 的正整数序列 d 1 d 2 d n d1 d2 dn xff08 d 1 lt d 2 lt lt d n
  • Luogu 3778 [APIO 2017] 商旅

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 看到这道题就想到了二分答案找负环 xff0c 但是怎么做呢 xff1f 完全不会 唉 xff0c 我太弱啦 xff01 先注意题目中说可以重复经过点和边 x
  • CF 963E Circles of Waiting

    传送门题目大意思路参考代码 传送门 题目大意 在平面直角坐标系上 xff0c 有一个神奇的点 xff0c 一开始在 0 0 0 0 每秒钟这个点都会随机移动 xff1a 如果它在 x y
  • CF 976F Minimal k-covering

    传送门题目大意 输入格式输出格式 思路参考代码 传送门 题目大意 给你一张二分图 G 61 U V E G 61 U V
  • CF 963A Alternating Sum

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 好不容易做得来一道题 xff0c 还是 A 题 xff08 所以不要瞧不起 A 题 xff09 xff0c 结果还写错了 xff08 不知道为什