注意判定公比为1的情况, 再求逆元后,并非为a == b,而应该求出q值进行判断
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 100005;
const int mod = 1000000009;
ll qpow(ll a, ll b) {
ll ret = 1;
while(b) {
if(b & 1) ret = ret * a % mod;
b >>= 1;
a = a * a % mod;
}
return ret;
}
ll inv(ll a) {
return qpow(a, mod-2);
}
int main() {
/*int t = sqrt(mod + 0.5);
for(int i = 2; i <= t; ++i) {
if(mod % i == 0) {
cout << i << endl;
break;
}
}*/
ll n, a, b, k;
while(cin >> n >> a >> b >> k) {
ll ans = 0;
for(int i = 0; i < k; ++i) {
char op;
cin >> op;
ll sign = op == '+' ? 1 : -1;
ans = (ans + sign * qpow(a, n - i) * qpow(b, i) % mod + mod) % mod;
}
ll t = (n + 1)/k;
ll temp = 1;
ll q = qpow(b, k)*inv(qpow(a, k)) % mod;
if(q == 1) {
temp = t;
}
else {
temp = (1 - qpow(q, t) + mod)%mod * inv((1 - q + mod)%mod) % mod;
//printf("q = %lld, temp = %lld\n", q, temp);
}
cout << (ans*temp%mod + mod)%mod << endl;
}
return 0;
}