给出n个数字,求子串gcd一共有多少种情况。
因为明确说明是子串了,第i个数字与前面的gcd,必然要经过i-1.也就是说直接和 i-1个与前面gcd得到的数进行gcd即可。
#include<stdio.h>
#include <algorithm>
#include<iostream>
#include<string.h>
#include<vector>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<deque>
#include<ctype.h>
#include<map>
#include<set>
#include<stack>
#include<string>
using namespace std;
long long gcd(long long a,long long b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
long long a[510000];
long long b[510000];
set<long long>c;
int main()
{
long long n;
cin>>n;
for(long long i=0;i<n;i++)
cin>>a[i];
long long cntb=1;
long long cntc=1;
b[0]=a[0];//b存放当前前面一个的gcd情况
c.insert(a[0]);//存放总的
for(long long i=1;i<n;i++)
{
for(long long j=0;j<cntb;j++)
{
long long gc=gcd(a[i],b[j]);
b[j]=gc;//直接覆盖,这样节省空间
}
b[cntb++]=a[i];
sort(b,b+cntb);
cntb=unique(b,b+cntb)-b;
for(long long j=0;j<cntb;j++)
{
c.insert(b[j]);
}
}
cout<<c.size()<<endl;
return 0;
}