http://acm.hdu.edu.cn/showproblem.php?pid=3706
一看就是单调队列的水题!
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
typedef long long ll;
ll n, a, b;
deque<pair<int,ll> > q;
int main()
{
while(cin>>n>>a>>b)
{
q.clear();
ll res = 1;
ll tmp = 1;
for(int i=1; i<=n; i++)
{
tmp = tmp*a%b;
while(!q.empty()&&q.back().second >= tmp) q.pop_back();
q.push_back(make_pair(i, tmp));
while(!q.empty()&&i - q.front().first > a) q.pop_front();
res = res * q.front().second %b;
}
printf("%lld\n", res);
}
return 0;
}