萌新96分求助,已经特判了p=2||5的情况
查看原帖
萌新96分求助,已经特判了p=2||5的情况
169555
Kiloio楼主2021/7/18 19:51

明明已经判了但一直不对,求助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
*/
2021/7/18 19:51
加载中...