Codeforces Round #475 (Div. 2) C - Alternating Sum
首先0-k项可以直接求出
其次后面(n+1)/k组项其实构成了等比数列(比值是a{-k}b)
那么此时还需考虑这个比值为1的特殊情况就行了(不仅a==b的时候这个比值会为1,因为取余,一些乱七八糟的情况也会造成比值为1)
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
#define MS(x, y) memset(x, y, sizeof(x))
#define MP(x, y) make_pair(x, y)
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 9;
char S[N];
ll Pow(ll x, ll y) {
ll result = 1;
while (y) {
if (y & 1)
result = result * x % MOD;
x = x * x % MOD;
y >>= 1;
}
return result;
}
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out1.txt", "w", stdout);
ll n, a, b, k;
while (~scanf("%lld %lld %lld %lld %s", &n, &a, &b, &k, S)) {
ll origin = Pow(a, n);
ll ans = 0;
ll aDivide = Pow(a, MOD - 2);
for (int i = 0; i < k; ++i) {
if (S[i] == '+')
ans = (ans + origin) % MOD;
else
ans = (ans - origin + MOD) % MOD;
// printf("%lld\n", origin);
origin = origin * aDivide % MOD * b % MOD;
}
// printf("%lld\n", ans);
ll mulUnit = Pow(Pow(a, k), MOD - 2) * Pow(b, k) % MOD;
ll times = (n + 1) / k;
ll ansUnit;
if (a == b || mulUnit == 1) {
ansUnit = times;
} else {
ansUnit = (Pow(mulUnit, times) - 1 + MOD) % MOD;
ansUnit = ansUnit * Pow((mulUnit - 1 + MOD) % MOD, MOD - 2) % MOD;
}
printf("%lld\n", ans * ansUnit % MOD);
}
return 0;
}
/*
5 2 3 3
+-+
5 1 1 3
+-+
*/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目