CF963A Alternating Sum
Posted 王宜鸣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF963A Alternating Sum相关的知识,希望对你有一定的参考价值。
思路:
利用周期性转化为等比数列求和。
注意当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
以上是关于CF963A Alternating Sum的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 963A Alternating Sum ( 思维 && 数论 )
Codeforces 963 A. Alternating Sum (逆元)
Codeforces 963 A. Alternating Sum (逆元)
Codeforces Round #475 (Div. 2) C - Alternating Sum
Codeforces Round #475 (Div. 2) C - Alternating Sum
Alternating Least Squares(ASL) for Implicit Feedback Datasets的数学推导以及用Python实现