HUD 3706 单调队列简单题

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.
 
   不描述题意了,三行英文挺明了的,今天刚学单调队列,自己模拟一下过了这题
   单调队列
   1,永远保持队首元素为最小值。
   2,插入时,先将队尾大于插入值的元素删去
   3,保证队首元素一直是合法,所需元素。
  代码
  #include<stdio.h>
#include<math.h>
int tou, wei, count;
struct cc
{
   __int64 value;
   int num;       
}mark[10000005];
void add ( int x ,int k)
{
  if(k == 1)  return;


  if( tou == wei )  {mark[tou].value = x; mark[wei].num = k; return;} 
  if(mark[tou].value > x) {mark[tou].value = x; mark[tou].num = k; wei = tou+1; return;}
  for(int i = wei - 1; i >= tou; i--) 
  {
     if(mark[i].value <= x)
     {
      mark[i+1].value = x;
      mark[i+1].num = k;
      wei = i + 2;
      break;
     }
  }      
  for(int i = tou; i < wei; i++)
  {
     if(mark[i].num < count)
     {
      tou++;              
     }      
     else break; 
  }
}
int main()
{
  int n, a, b;
  __int64 k;
  __int64 sum, ji;
  while(scanf("%d%d%d", &n, &a, &b) != EOF)
  {
    count = -1, ji = 1;
    mark[0].value = a % b;
    mark[0].num = 1;
    tou = 0, wei = 1, k = 1;
    for(int i = 1; i <= n; i++)
    {
      k = k * a % b;
      count = i - a;
      add(k, i); 
      ji *= mark[tou].value;
      if( ji >= b ) ji %= b;      
    }     
    printf("%I64d\n", ji); 
  }      
}
  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值