明明已经判了但一直不对,求助QAQ
//#pragma GCC optimize(2)
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <cstring>
using namespace std;
long long n,p,m,m_sqrt,sum[200005],a[200005],biao,cnt[200005],l,r,book[200005],ans[200005],tot;
char s[200006];
struct node{
int l,r,id;
}ask[200006];
bool cmp(node x,node y){
if(x.r/m_sqrt==y.r/m_sqrt){
return x.l<y.l;
}
return x.r<y.r;
}
inline void add(int x){
tot+=cnt[x],cnt[x]++;
}
inline void del(int x){
cnt[x]--,tot-=cnt[x];
}
inline void special(){
bool biao_special[200006];
long long snum[200006],spos[200006];
if(p==2) biao_special[0]=biao_special[2]=biao_special[4]=biao_special[6]=biao_special[8]=1;
if(p==5) biao_special[0]=biao_special[5]=1;
for(int i=1; i<=n; i++){
snum[i]=snum[i-1]+biao_special[s[i]-'0'];
spos[i]=spos[i-1]+biao_special[s[i]-'0']*i;
}
scanf("%lld",&m);
for(int i=1; i<=m; i++){
scanf("%d%d",&ask[i].l,&ask[i].r);
printf("1\n");
}
}
int main(){
scanf("%lld%s",&p,s+1);
int n=strlen(s+1);
s[0]=' ';
if(p==2 || p==5){
special();
return 0;
}
m_sqrt=sqrt(n);
biao=1,sum[n+1]=0;
for(register int i=n; i>=1; --i){
sum[i]=(sum[i+1]+(s[i]-'0')*biao%p)%p,book[i]=sum[i],biao=(biao*10)%p;
}
sort(book+1,book+n+2);
int n_true=unique(book+1,book+n+2)-book-1;
for(int i=1; i<=n+1; ++i){
sum[i]=lower_bound(book+1,book+n_true+1,sum[i])-book;
}
scanf("%lld",&m);
for(register int i=1; i<=m; ++i){
scanf("%d%d",&ask[i].l,&ask[i].r);
ask[i].id=i;
}
sort(ask+1,ask+1+m,cmp);
l=1,r=0;
for(register int i=1; i<=m; ++i){
while(r<ask[i].r+1) add(sum[++r]);
while(r>ask[i].r+1) del(sum[r--]);
while(l>ask[i].l) add(sum[--l]);
while(l<ask[i].l) del(sum[l++]);
ans[ask[i].id]=tot;
}
for(register int i=1; i<=m; ++i){
printf("%d\n",ans[i]);
}
return 0;
}
/*
11
121121
2
1 6
1 5
*/