HDU-3706 Second My Problem First

http://acm.hdu.edu.cn/showproblem.php?pid=3706

Second My Problem First

Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1330    Accepted Submission(s): 503


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.
 

 

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.
 

 

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<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#define len 0x7fffffff
using namespace std;
struct node
{
   __int64 num;
   int p;
};
node q1[1000010];
//int p[1000010];
int main()
{
   __int64  a,b;
   int  n,i,t;
   while(~scanf("%d%I64d%I64d",&n,&a,&b))
   {
       __int64 ti=1;
         __int64  s=1;

       int head=0,r=0;
    for(i=1;i<=n;i++)
       {
           s=(s*a)%b;
            while(head<r&&q1[r].num>=s) r--;
            q1[++r].num=s;
             q1[r].p=i;
        while(q1[head+1].p<i-a)
                  head++;
            ti=(ti*q1[head+1].num)%b;
         
        }
       printf("%I64d\n",ti);
   }
   return 0;
}

 

你可能感兴趣的:(first)