zoukankan      html  css  js  c++  java
  • 【bzoj4542】[Hnoi2016]大数

      1 #include<algorithm>
      2 #include<iostream>
      3 #include<cstdlib>
      4 #include<cstring>
      5 #include<cstdio>
      6 #include<cmath>
      7 using namespace std;
      8  
      9 typedef long long LL;
     10   
     11 #define N 100010
     12  
     13 struct Node
     14 {
     15     LL val;
     16     int id;
     17 }md[N];
     18  
     19 struct data
     20 {
     21     int l,r,id;
     22 }ask[N];
     23  
     24 char s[N];
     25  
     26 LL c[N],d[N],h[N];
     27 LL a[N];
     28  
     29 LL p;
     30 int m,n;
     31 int l,r;
     32  
     33 int len,K;
     34  
     35 int cmp(Node aa,Node bb)
     36 {
     37     return aa.val<bb.val;
     38 }
     39  
     40 int cmp2(data aa,data bb)
     41 {
     42     return aa.l/K==bb.l/K ? aa.r<bb.r : aa.l<bb.l;
     43 }
     44  
     45 void work()
     46 {
     47     for (int i=1;i<=len;i++)
     48     {
     49         d[i]=d[i-1]+((s[i-1]-'0')%p ? 0 : i);
     50         c[i]=c[i-1]+((s[i-1]-'0')%p==0);
     51     }
     52     scanf("%d",&m);
     53     while (m--)
     54     {
     55         scanf("%d%d",&l,&r);
     56         printf("%lld
    ",d[r]-d[l-1]-(c[r]-c[l-1])*(l-1));
     57     }
     58 }
     59  
     60 int main()
     61 {
     62     scanf("%lld",&p);
     63     scanf("%s",s);
     64     len=strlen(s);
     65     K=sqrt(len)+1;
     66     if (p==2 || p==5)
     67     {
     68         work();
     69         return 0;
     70     }
     71     LL res=1;
     72     for (int i=len-1;i>=0;i--)
     73     {
     74         md[i].val=(md[i+1].val+(s[i]-'0')*res)%p;
     75         md[i].id=i;
     76         res=res*10%p;
     77     }
     78     md[len].id=len;
     79     sort(md,md+len+1,cmp);
     80     res=0;
     81     for (int i=0;i<=len;i++)
     82     {
     83         if (i && md[i].val!=md[i-1].val)
     84             res++;
     85         h[md[i].id]=res;
     86     }
     87     scanf("%d",&m);
     88     for (int i=0;i<=m;i++)
     89     {
     90         scanf("%d%d",&ask[i].l,&ask[i].r);
     91         ask[i].l--;
     92         ask[i].id=i;
     93     }
     94     sort(ask,ask+m,cmp2);
     95     int L(0),R(-1);
     96     res=0;
     97     for (int i=0;i<m;i++)
     98     {
     99         while (R<ask[i].r)
    100             res+=c[h[++R]]++;
    101         while (R>ask[i].r)
    102             res-=--c[h[R--]];
    103         while (L>ask[i].l)
    104             res+=c[h[--L]]++;
    105         while (L<ask[i].l)
    106             res-=--c[h[L++]];
    107         a[ask[i].id]=res;
    108     }
    109     for (int i=0;i<m;i++)
    110         printf("%lld
    ",a[i]);
    111     return 0;
    112 }
  • 相关阅读:
    C#CreateGraphics方法的三种实现方式
    二叉树的性质和常用操作代码集合
    《Java程序设计基础》 第8章手记Part 2
    《Java程序设计基础》 第8章手记Part 1
    STL 算法罗列 (转)
    STL 练习
    STL所有算法简介 (转) http://www.cnblogs.com/yuehui/archive/2012/06/19/2554300.html
    linux 解压命令
    杭电1016
    杭电1257
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5492932.html
Copyright © 2011-2022 走看看