简单等比数列求和题,在牛客上交是96分,CF一直挂第9个点。
#include<bits/stdc++.h>
using namespace std;
#define inv(x) quick_pow(x,MOD-2)
typedef long long ll;
const int MAXN=1e5+5;
const int MOD=1e9+9;
char s[MAXN];
int quick_pow(int a,int b)
{
int ret=1;
while(b)
{
if(b&1) ret=(ll)ret*a%MOD;
a=(ll)a*a%MOD,b>>=1;
}
return ret;
}
int main()
{
int n,a,b,k;
cin>>n>>a>>b>>k;
scanf("%s",s);
int num=0,tmp=(int)((ll)b*inv(a)%MOD);
for(int i=0;i<k;++i)
{
if(s[i]=='-') num=(num-quick_pow(tmp,i)+MOD)%MOD;
else num=(num+quick_pow(tmp,i))%MOD;
}
num=(ll)num*quick_pow(a,n)%MOD;
tmp=quick_pow(tmp,k);
int ans;
if(num==1) ans=(ll)(n+1)/k*num%MOD;
else ans=(ll)num*(1-quick_pow(tmp,(n+1)/k)+MOD)%MOD*inv(1-tmp+MOD)%MOD;
cout<<ans;
return 0;
}