Problem Description
Give you three integers n, A and B.
Then we define S i = A i mod B and T i = Min{ S k | i-A <= k <= i, k >= 1}
Your task is to calculate the product of T i (1 <= i <= n) mod B.
Then we define S i = A i mod B and T i = Min{ S k | i-A <= k <= i, k >= 1}
Your task is to calculate the product of T i (1 <= i <= n) mod B.
Input
Each line will contain three integers n(1 <= n <= 10
7),A and B(1 <= A, B <= 2
31-1).
Process to end of file.
Process to end of file.
Output
For each case, output the answer in a single line.
Sample Input
1 2 3 2 3 4 3 4 5 4 5 6 5 6 7
Sample Output
2 3 4 5 6
这题可以用单调队列做,存储每次的时间和大小。
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<map> #include<string> using namespace std; #define maxn 10000005 #define ll __int64 ll q[maxn][2]; int main() { ll n,m,A,B,ans,front,rear,time,sum,timenow; int i,j; while(scanf("%I64d%I64d%I64d",&n,&A,&B)!=EOF) { front=1;rear=0;ans=1;sum=1; for(i=1;i<=n;i++){ ans=(ans*A)%B; if(i-A<1)time=1; else time=i-A; while(front<=rear && ans<=q[rear][0]){ rear--; } rear++; q[rear][0]=ans;q[rear][1]=i; while(front<=rear && q[front][1]<time)front++; sum=(sum*q[front][0])%B; } printf("%I64d\n",sum%B); } return 0; }