标签:its long for == nat ++ 周期性 amp 等于
思路:
利用周期性转化为等比数列求和。
注意当a != b的时候 bk * inv(ak) % (109 + 9)依然有可能等于1,不知道为什么。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll MOD = 1e9 + 9; 5 ll mypow(ll x, ll n) 6 { 7 ll ans = 1; 8 while (n) 9 { 10 if (n & 1) ans = ans * x % MOD; 11 x = x * x % MOD; 12 n >>= 1; 13 } 14 return ans; 15 } 16 ll inv(ll x) 17 { 18 return mypow(x, MOD - 2); 19 } 20 ll cal(ll x, ll a, ll b, ll n, ll k) 21 { 22 ll q = mypow(b, k) * inv(mypow(a, k)) % MOD; 23 if (q == 1) return x * n % MOD; 24 return x * (mypow(q, n) - 1 + MOD) % MOD * inv(q - 1) % MOD; 25 } 26 int main() 27 { 28 ll n, a, b, k, x, q, l; 29 string s; 30 while (cin >> n >> a >> b >> k >> s) 31 { 32 ll ans = 0, l = (n + 1) / k; 33 for (int i = 0; i < k; i++) 34 { 35 x = mypow(a, n - i) * mypow(b, i) % MOD; 36 ll tmp = (s[i] == ‘+‘ ? 1 : -1) * cal(x, a, b, l, k); 37 ans = (ans + tmp) % MOD; 38 ans = (ans + MOD) % MOD; 39 } 40 cout << ans << endl; 41 } 42 return 0; 43 }
Alternating Sum
标签:its long for == nat ++ 周期性 amp 等于
原文地址:https://www.cnblogs.com/wangyiming/p/9077207.html