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(R3e18) 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<

 

你可能感兴趣的:(codeforces)