View Code of Problem 3571

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define N 100011
int mod=1e9+7;
int a[N],l[N],r[N],n;
void findleft(int x)
{
        int i,flag=0;
        for(i=x-1;i>=1;i--)
        {
                if(a[x]%a[i]==0)
                {
					flag=1;
					l[x]=i+1;
					break;
                }
        }
		if(flag==0)
			l[x]=1;
}
void findright(int x)
{
        int i,flag=0;
        for(i=x+1;i<=n;i++)
        {
                if(a[x]%a[i]==0)
                {
					flag=1;
                    r[x]=i-1;
					break;
                }
        }
        if(flag==0)
            r[x]=n;
}
int main()
{
		//freopen("1001.in","r",stdin);
        int i;
        long long cnt;
        while(scanf("%d",&n)!=EOF)
        {
                cnt=0;
                for(i=1;i<=n;i++)
                {
                        r[i]=l[i]=i;
                        scanf("%d",&a[i]);
                }
                for(i=1;i<=n;i++)
                {
                        findleft(i);
                        findright(i);
                }
                for(i=1;i<=n;i++)
                {
                    cnt=(cnt+(long long)(i-l[i]+1)*(r[i]-i+1)%mod)%mod;
                }
                printf("%I64d\n",cnt);
        }
        return 0;
}

Double click to view unformatted code.


Back to problem 3571