就是一道用单调队列求区间最小值的问题,然后把每个区间的最小值累乘起来。
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int M=1010;
const int N=100010;
const int INF=1e9;
ll n,A,B,s ,q[N],pos[N];
int main()
{
int i,j;
while(~scanf("%lld%lld%lld",&n,&A,&B))
{
int head=0,tail=0;
ll ans=1; s=1;
for (i=1;i<=n;i++) {
s=(s*A)%B;
while(head<tail && q[tail-1]>=s) tail--;
pos[tail]=i;
q[tail++]=s;
while(head<tail && i-pos[head]>A) head++;
ans=(ans*q[head])%B;
}
printf("%lld\n",ans);
}
}