题意
给定求
数据范围:
题解
妥妥的公式推导题(数据范围也可以看出)
很容易得到通项公式(条件有)
主要问题就在于如何处理,若也为那么计算是很容易的(对于递推式计算会因为有常数而使结果复杂)
那么我们构造,我们可以解出
若存在则
对于,分进行讨论即可
那么问题主要在于求解,有这么一个等式
若; 若
于是我们解决存在的情况
若不存在,说明
,,若这里有一个错位求和,时计算结果显然
有
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
using LL = long long;
const LL MOD = 1e9 + 7;
LL p, q, r, n, ans;
LL qpow(LL, LL);
int main(){
cin >> p >> q >> r >> n;
if(p == 1){
if(q == 0)
ans = n * r % MOD * 3 % MOD;
else{
if(q == 1)
ans = 3 * r % MOD * ((n) * (n + 1) / 2 % MOD) % MOD;
else{
ans = 3 * r % MOD * qpow(q, n) % MOD;
LL sum, qn, qn_;
qn_ = qpow(q, n - 1), qn = qn_ * q % MOD;
sum = ((qn - 1 + MOD) % MOD * qpow((qn - qn_ + MOD) % MOD, MOD - 2) % MOD - n * qpow(qn, MOD - 2) % MOD + MOD) % MOD;
sum = sum * qpow((q - 1 + MOD) % MOD, MOD - 2) % MOD;
ans = ans * sum % MOD;
}
}
}else{
LL k = r * qpow((p - 1 + MOD) % MOD, MOD - 2) % MOD;
LL c0 = k;
if(q == 1)
ans = 3 * k % MOD * (n + 1) % MOD;
else
ans = 3 * k % MOD * ((qpow(q, n + 1) - 1 + MOD) % MOD) % MOD * qpow((q - 1 + MOD) % MOD, MOD - 2) % MOD;
LL sum;
sum = 3 * c0 % MOD;
if(p == q)
sum = sum * (n + 1) % MOD * qpow(p, n) % MOD;
else{
sum = sum * ((qpow(p, n + 1) - qpow(q, n + 1) + MOD) % MOD) % MOD * qpow((p - q + MOD) % MOD, MOD - 2) % MOD;
}
ans = (sum - ans + MOD) % MOD;
}
cout << ans << endl;
return 0;
}
LL qpow(LL x, LL n){
LL res = 1;
while(n){
if(n & 1) res = res * x % MOD;
x = x * x % MOD;
n >>= 1;
}
return res;
}