1 条题解
-
0
如果区间里面有一个不是g的倍数,其他都是g的倍数,那么我一定可以让区间的gcd为g,直接需要改那个非倍数就好了;如果区间里面都是g的倍数,这个时候,只要我随便改一个数为g,那么gcd一定就是g
这里我为了方便,把数组中可以整除g的映射为1,其余的为0,然后同向双指针,每次右边界扩大的时候,其实多的区间数就是原区间元素(因为原区间里每一个元素都可以和新元素组成一个区间),运用这个贡献法的思想就可以了
不懂这里为什么这里可以计算贡献的,自己用样例演算一下即可
#include <bits/stdc++.h> using namespace std; using ll= long long; const int N=1e5+10; int a[N]; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n,g;cin>>n>>g; for (int i=1;i<=n;++i) { ll res;cin>>res; if (res%g==0) a[i]=1; else a[i]=0; } int l=1,r=0,find0=0; ll ans=0; while(r<n) { if (a[r+1]==1) { ans+=r-l+1; ++r; } else if (a[r+1]==0 && find0==0) { ans+=r-l+1; ++r; find0=1; } else { if (a[l]==0) find0=0; ++l; } } cout<<ans; }
- 1
信息
- ID
- 433
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 50
- 已通过
- 15
- 上传者