社区讨论
T11,求救啊啊
CF475DCGCDSSQ参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo7lwrob
- 此快照首次捕获于
- 2023/10/27 03:58 2 年前
- 此快照最后确认于
- 2023/10/27 03:58 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
#define Re register
const int N=1e5+10;
int n,m,a[N],k[N][23];
map<int,long long> cnt;
int GCD(int x,int y)
{
while(y)
{
x%=y;
swap(x,y);
}
return x;
}
inline void pregcd()
{
for(int i=1;i<=n;i++)k[i][0]=a[i];
for(int i=1;i<=22;i++)
{
for(int j=1;j+(1<<i)-1<=n;j++)
{
k[j][i]=GCD(k[j][i-1],k[j+(1<<(i-1))][i-1]);
}
}
}
inline int gcd(int l,int r)
{
if(r==n+1)return 66666666;
return GCD(k[l][(int)log2(r-l+1)],k[r-(1<<(int)log2(r-l+1))+1][(int)log2(r-l+1)]);
}
inline int search(int LL,int L,int R,int k)
{
Re int l=L,r=R,ans;
while(l<=r)
{
Re int mid=l+r>>1;
if(gcd(LL,mid)!=k)
{
ans=mid;
r=mid-1;
}else l=mid+1;
}
return ans;
}
int main()
{
scanf("%d",&n);
for(Re int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
pregcd();
for(Re int i=1;i<=n;i++)
{
int nowl=i;
while(nowl<=n)
{
Re int p=search(i,nowl+1,n+1,gcd(i,nowl));
cnt[gcd(i,nowl)]+=p-nowl;
nowl=p;
}
}
scanf("%d",&m);
for(Re int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
cout<<cnt[x]<<"\n";
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...