链接:http://codeforces.com/contest/964/problem/C
题意:其实我也没怎么读懂题意,也很难这样想到,还是看了题解之后自己写的代码!~!
题解链接 http://codeforces.com/blog/entry/58991
如果是求逆元,那么很简单,但是题换了点形式,自己就很难想到要这样推导了!~
刚开始的时候没想到后面的一个求和等式可以直接用等比数列求和公式来,让自己TLE了一次,想了很久才发现问题所在;比较悲剧的是,在用等比数列求和公式的时候把q个求措了!~!q=(b/a)^k;结果被我求成了q=(b^k)/a。WA了很多很多发
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll mod=1e9+9; 5 const int maxk=1e5+10; 6 ll n,a,b,k; 7 char s[maxk]; 8 ll Q_pow(ll x,ll n){ 9 ll ans=1; 10 while(n){ 11 if(n&1){ 12 ans=ans*x%mod; 13 } 14 x=x*x%mod; 15 n>>=1; 16 } 17 return ans; 18 } 19 ll Get_Z(ll a,ll b){ 20 ll ans=0; 21 for(int i=0;i<=k-1;i++){ 22 ll ta=Q_pow(a,n-i); 23 ll tb=Q_pow(b,i); 24 if(s[i]=='+') 25 ans=(ans+ta*tb%mod+mod)%mod; 26 else 27 ans=(ans-ta*tb%mod+mod)%mod; 28 } 29 return ans; 30 } 31 int main() 32 { 33 while(cin>>n>>a>>b>>k){ 34 cin>>s; 35 ll Z=Get_Z(a,b); 36 ll B=Q_pow(b,k); 37 ll A=Q_pow(a,mod-2); 38 A=Q_pow(A,k); 39 ll q=A*B%mod; 40 41 ll sum=0; 42 ll qn=(n+1)/k-1; 43 if(q==1) 44 sum=(qn+1)%mod; 45 else 46 sum=(Q_pow(q-1,mod-2)*(Q_pow(q,qn+1)-1))%mod; 47 cout<<(Z*sum+mod)%mod<<endl; 48 } 49 return 0; 50 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll mod=1e9+9; 5 const int maxk=1e5+10; 6 ll n,a,b,k; 7 char s[maxk]; 8 ll Q_pow(ll x,ll n){ 9 ll ans=1; 10 while(n){ 11 if(n&1){ 12 ans=ans*x%mod; 13 } 14 x=x*x%mod; 15 n>>=1; 16 } 17 return ans; 18 } 19 ll Get_Z(ll a,ll b){ 20 ll ans=0; 21 for(int i=0;i<=k-1;i++){ 22 ll ta=Q_pow(a,n-i); 23 ll tb=Q_pow(b,i); 24 if(s[i]=='+') 25 ans=(ans+ta*tb%mod+mod)%mod; 26 else 27 ans=(ans-ta*tb%mod+mod)%mod; 28 } 29 return ans; 30 } 31 ll Get_q(ll a,ll b){ 32 ll t=(n+1)/k; 33 ll ans=0; 34 ll A=Q_pow(a,mod-2); 35 for(ll i=0;i<t;i++){ 36 ll tb=Q_pow(b,i*k); 37 ll ta=Q_pow(A,i*k); 38 ans=(ans+tb*ta%mod)%mod; 39 } 40 return ans; 41 } 42 int main() 43 { 44 while(cin>>n>>a>>b>>k){ 45 cin>>s; 46 ll t1=Get_Z(a,b); 47 ll t2=Get_q(a,b); 48 //cout<<t1<<endl; 49 //cout<<t2<<endl; 50 cout<<t1*t2%mod; 51 } 52 return 0; 53 }