Codeforces 963A Alternating Sum ( 思維 && 數論 )
阿新 • • 發佈:2018-04-20
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 & 1View Code) 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; }
Codeforces 963A Alternating Sum ( 思維 && 數論 )