Submission #428419

#TimeUsernameProblemLanguageResultExecution timeMemory
428419jamielimLinear Garden (IOI08_linear_garden)C++14
100 / 100
26 ms10040 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb emplace_back
#define ALL(x) x.begin(),x.end()
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int,int> ii;
typedef pair<ii,ii> i4;
const int MOD=1000000007;
const int INF=1012345678;
const ll LLINF=1012345678012345678LL;
const double PI=3.1415926536;
const double EPS=1e-14;

int n,m;
char str[1000005];
ll two[1000005];

ll dp(int x,int l,int h,int c){
	//printf("%d %d %d %d\n",x,l,h,c);
	if(h-l>2||c>=5||c<0)return 0;
	ll ans=0;
	if(h-l==2){
		if(c==(l+h)/2)ans=two[(x+1)/2];
		else ans=two[x/2];
	}else{ // 1
		ans=two[x/2]+two[(x+1)/2]-1;
	}
	return ans%m;
}

int main(){
	scanf("%d%d %s",&n,&m,str);
	two[0]=1;for(int i=1;i<1000005;i++)two[i]=(two[i-1]*2LL)%m;
	ll ans=0;
	int lo=2,hi=2,cur=2;
	for(int i=0;i<n;i++){
		if(str[i]=='L')cur++;
		else{
			ans+=dp(n-i-1,lo,max(cur+1,hi),cur+1);
			//printf("%lld\n",dp(n-i-1,lo,max(cur+1,hi),cur+1));
			cur--;
		}
		lo=min(cur,lo);hi=max(cur,hi);
		ans%=m;
	}
	printf("%lld",(ans+m+1)%m);
}

Compilation message (stderr)

linear_garden.cpp: In function 'int main()':
linear_garden.cpp:37:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |  scanf("%d%d %s",&n,&m,str);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...