解题思路:这个题目求的是全部的Ti的乘积mod B,我们看到Ti是从Si生成的。那么我们只要维持一个关于si的单调队列,使得队列里面的元素为非递减排列,第一个元素就是ti。
#include<cstdio>
#include<cmath>
#include<vector>
#define ll __int64
using namespace std;
ll n, a, b;
vector<ll> num;
int main(){
int i, j, k;
ll ans, q;
while(~scanf("%I64d%I64d%I64d", &n, &a, &b)){
num.clear();
q = ans = a % b;
for(i = 1; i <= n; i++){
if(num.size() == 0){
num.push_back(q);
q = q * a % b;
continue;
}
if(q > num[num.size() - 1]){
ans = num[0] * ans % b;
q = q * a % b;
continue;
}
j = num.size() - 1;
while(j >= 0 && num[j] > q){
j--;
}
j++;
num[j] = q;
q = q * a % b;
ans = ans * num[0] % b;
}
printf("%I64d\n", ans);
}
return 0;
}