codeforces 992D. Nastya and a Game【思维】

https://blog.csdn.net/Haipai1998/article/details/80740649

Nastya and a Game

题意:给定一个Arr[n],求满足multipul[L,R]/sum[L,R]==k的区间个数

思路:对于a[i]==1的情况,因为对multipul是没有影响的,只影响L,R。那么对于连续的区间1我们就可以跳,只要sum[L,R]∈[sum/multiple,sum/multiple+ lenof[1] ]。根据数据有multipul不会超过2e18。那么根据以上的做法,因为每次乘的数都是≥2的,第二层while循环的次数不会超过61次。复杂度为O(60*n)

int N,K;
ll A[202020];
ll S[202020];
int nex[202020];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N>>K;
	FOR(i,N) cin>>A[i];
	x=N;
	for(i=N-1;i>=0;i--) {
		nex[i]=x;
		if(A[i]!=1) x=i;
	}
	
	ll ret=0;
	FOR(i,N) {
		int R=i;
		ll p=1;
		ll s=0;
		while(R<N) {
			if((double)p*A[R]>3e18) break;
			p*=A[R];
			s+=A[R];
			int add=nex[R]-R-1;
            ///下面一个if是关键 利用了全是1的单调性(只减不增)判断区间是否有某个a加入后满足条件
			if(p%K==0) {
				if(s*K<=p && p<=(s+add)*K) ret++;
			}
			
			s+=add;
			R=nex[R];
		}
	}
	
	
	cout<<ret<<endl;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值