题意
求等比数列的和并对 1e9+9 1 e 9 + 9 取模。- 分析
S=a1(qlen−1)q−1 S = a 1 ( q l e n − 1 ) q − 1 , q=bk∗(inv(a))k(mod1e9+9),其中len=(n+1)/k,inv(a)为a的逆元 q = b k ∗ ( i n v ( a ) ) k ( mod 1 e 9 + 9 ) , 其 中 l e n = ( n + 1 ) / k , i n v ( a ) 为 a 的 逆 元 。
需要注意的是,判断 q==1 q == 1 不能看 a==b(mod1e9+9) a == b ( mod 1 e 9 + 9 ) ,而是要用上面那种计算方法。 - 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a,b,k;
string c;
const ll mod =1e9+9;
ll quickpow(ll a, ll b)
{
ll ret = 1;
a %= mod;
while(b)
{
if (b&1) ret = (ret * a) % mod;
b >>= 1;
a =(a*a) % mod;
}
return (ret%mod+mod)%mod;
}
ll inv(ll a){return quickpow(a, mod - 2);}
int main()
{
cin>>n>>a>>b>>k;
cin>>c;
ll a1=0,ans;
for(int i=0;i<k;++i)
{
if(c[i]=='+') a1=((a1+quickpow(a,n-i)*quickpow(b,i))%mod+mod)%mod;
else a1=((a1-quickpow(a,n-i)*quickpow(b,i))%mod+mod)%mod;
}
ll q=quickpow(inv(a),k)*quickpow(b,k)%mod;
if(q!=1)
{
ans=a1*(quickpow(q,(n+1)/k)-1)%mod*inv(q-1)%mod;
while(ans<0) ans+=mod;
}
else
ans=a1*((n+1)/k)%mod;
cout<<ans<<endl;
return 0;
}