zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    linux基础知识-12
    linux基础知识-11
    linux基础知识-10
    安装与迁移Solo博客系统
    linux基础知识-9
    linux基础知识-8
    linux基础知识-7
    linux基础知识-6
    linux基础知识-5
    通俗解释下分布式、高并发、多线程
  • 原文地址:https://www.cnblogs.com/wangyiming/p/9077207.html
Copyright © 2011-2022 走看看