社区讨论
线段树70pts求调
CF818ECard Game Again参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mlkhuboq
- 此快照首次捕获于
- 2026/02/13 14:15 6 天前
- 此快照最后确认于
- 2026/02/16 11:50 3 天前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define N 100005
#define ls rt<<1
#define rs rt<<1|1
const int awa=-114514;
struct node{
int l,r,mul;
}tree[N<<2];
int n,k,ans,a[N];
void push_up(int rt){
tree[rt].mul=(tree[ls].mul*tree[rs].mul)%k;
return;
}
void build(int rt,int x,int y){
tree[rt].l=x,tree[rt].r=y;
if(x==y){
tree[rt].mul=a[x]%k;
return;
}
int mid=(x+y)>>1;
build(ls,x,mid);
build(rs,mid+1,y);
push_up(rt);
return;
}
int query(int rt,int x,int y){
if(x<=tree[rt].l&&y>=tree[rt].r) return tree[rt].mul%k;
int ret=0,mid=(tree[rt].l+tree[rt].r)>>1;
if(x<=mid) ret=query(ls,x,y);
if(y>mid) ret=query(rs,x,y);
return ret;
}
signed main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(int i=1;i<=n;i++)
{
int l=i,r=n,t=awa;
while(l<=r)
{
int mid=(l+r)/2;
if(query(1,i,mid)==0){
t=mid;
r=mid-1;
}
else l=mid+1;
}
if(t!=awa) ans+=n-t+1;
}
cout<<ans;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...