Codeforces #475 div2

题目链接:http://codeforces.com/contest/964

A题 答案n/2+1;

B题 讨论三种情况

c>b

c==b

c<b

C题

数论,逆元+快速幂,但是我一直卡在了取模这个地方。迷之wa

AC代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<stdio.h>
 5 #define ll long long
 6 #define MOD 1000000009
 7 using namespace std;
 8 char s[100500];
 9 ll quick_pow(ll a,ll b,ll n,ll x){
10     ll ans=1,base=a;
11     ll y=n-x;
12     while(y!=0){
13         if(y&1){
14             ans=(ans*base)%MOD;
15         }
16         base=(base*base)%MOD;
17         y>>=1;
18     }
19     base=b;
20     while(x!=0){
21         if(x&1){
22             ans=(ans*base)%MOD;
23         }
24         base=(base*base)%MOD;
25         x>>=1;
26     }
27     return ans%MOD;
28 }
29 ll qkm(ll a,ll y){
30     ll ans=1,base=a;
31     while(y!=0){
32         if(y&1){
33             ans=(ans*base)%MOD;
34         }
35         base=(base*base)%MOD;
36         y>>=1;
37     }
38     return ans%MOD;
39 }
40 int main(){
41     ll n,a,b,k;
42     cin>>n>>a>>b>>k;
43     scanf("%s",s);
44     ll ans=0;
45     /*for(ll i=0;i<k;i++){
46         if(s[i]=='+'){
47             ans=(ans+quick_pow(a,b,n,i))%MOD;
48         }else{
49             ans=(ans-quick_pow(a,b,n,i))%MOD;
50         }
51     }*/
52     for (ll i=0;i<k;i++)
53     {
54         if(s[i]=='+')
55         {
56             ans= (ans+qkm(a,n-i)*qkm(b,i)%MOD+MOD)%MOD;
57         }
58         if(s[i]=='-')
59         {
60             ans= (ans-qkm(a,n-i)*qkm(b,i)%MOD+MOD)%MOD;
61         }
62     }
63     ll cir=(n+1)/k;
64     //ll inva=qkm(a,MOD-2);
65     ll q=(qkm(b,k)*qkm(a,k*(MOD-2)))%MOD;
66     if(q!=1){
67         ans=ans*(qkm(q,cir)-1)%MOD*(qkm(q-1,MOD-2))%MOD; //这里,如果我先对后面两个取模就会wa,错在第7组测试数据,迷~
68     }else{
69         ans=(cir*ans)%MOD;
70     }
71     cout<<ans<<endl;
72     return 0;
73 }

 

posted @ 2018-04-19 11:29  ISGuXing  阅读(228)  评论(0编辑  收藏  举报