1. 程式人生 > >Codeforces 963A Alternating Sum ( 思維 && 數論 )

Codeforces 963A Alternating Sum ( 思維 && 數論 )

contest hide none get string str 題目 href 答案

題意 : 題目鏈接

分析 :

Tutorial 講的很清楚

技術分享圖片

技術分享圖片

至於為什麽這樣去考慮

算是一個經驗問題吧

如果一個問題要你給出模意義下的答案

就多考慮一下答案是要用逆元構造出來

也就說明有除法的存在

那麽可以去考慮等比數列或者等差數列求和公式等

技術分享圖片
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod = 1e9 + 9;

LL pow_mod(LL a, LL b)
{
    LL ret = 1;
    while(b){
        if(b & 1
) ret = (ret * a) % mod; a = (a * a) % mod; b >>= 1; }return ret; } LL inv(LL a) { return pow_mod(a, mod-2); } LL n, a, b, k, tmp; int main(void) { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>a>>b>>k; string str; cin>>str; LL a0
= 0; for(int i=0; i<k; i++){ tmp = ( pow_mod(a, n-i) * pow_mod(b, i) ) % mod; if(str[i] == -) a0 = ((a0 - tmp) + mod) % mod; else a0 = (a0 + tmp) % mod; } LL inv_a = inv(a); tmp = (b * inv_a)%mod; LL q = pow_mod(tmp, k); LL res; if(q == 1){ res
= (a0 * (n+1)/k)%mod; cout<<res<<endl; return 0; } LL qq = pow_mod(tmp, n+1); LL inv_q_1 = inv((q-1+mod)%mod); res = (a0 * (qq - 1 + mod)%mod )%mod; res = (res * inv_q_1) % mod; cout<<res<<endl; return 0; }
View Code

Codeforces 963A Alternating Sum ( 思維 && 數論 )