Problem Description
Give you three integers n, A and B.
Then we define Si = Ai mod B and Ti = Min{ Sk | i-A <= k <= i, k >= 1}
Your task is to calculate the product of Ti (1 <= i <= n) mod B.
Input
Each line will contain three integers n(1 <= n <= 107),A and B(1 <= A, B <= 231-1).
Process to end of file.
Output
For each case, output the answer in a single line.
一眼看去就是单调队列来搞。。。只不过写错了好几发。。单调队列的水题了。
#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;
}