Submission #1284949

#TimeUsernameProblemLanguageResultExecution timeMemory
1284949tripleabatteryLinear Garden (IOI08_linear_garden)C++20
100 / 100
237 ms9368 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
using namespace chrono;
typedef long long ll;
typedef pair<ll,ll> pii;

ll exp(ll b, ll e, ll m)
{
    if(!e)return 1;
    ll mew=exp(b,e/2,m)%m;
    if(e%2)return (((mew*mew)%m)*b)%m;
    else return (mew*mew)%m;
}

int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    ll n,m; cin>>n>>m;
    string s; cin>>s;
    vector<ll> dp(n+1);
    dp[0]=1;
    for(ll i=1;i<=n;i++)
    {
        dp[i]=(exp(2,((i-1)/2),m))+dp[i-1];
    }
    ll ans=1;
    pii mew={2ll,2};
    for(ll i=1;i<=n;i++)
    {
        ll k=n-i;
        if(s[i-1]=='P')
        {
            pii riz={mew.fi-1,min(2ll,mew.se+1)};
            if(riz==pii{1,2}||riz==pii{2,1})ans=(ans+dp[k])%m;
            if(riz==pii{0,2}||riz==pii{2,0})ans=(ans+exp(2,((k)/2),m))%m;
            if(riz==pii{1,1}||riz==pii{1,1})ans=(ans+exp(2,((k+1)/2),m))%m;
            if(riz==pii{1,0}||riz==pii{0,1})ans=(ans+1)%m;
            mew={min(2ll,mew.fi+1),mew.se-1};
        }
        else mew={mew.fi-1,min(2ll,mew.se+1)};
    }
    cout<<(ans%m)<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...