1. 程式人生 > >HDU5288——OO’s Sequence(2015多校-1001)

HDU5288——OO’s Sequence(2015多校-1001)

智商 turn 。。 i++ 數組 不能 class pen acm

http://acm.hdu.edu.cn/showproblem.php?pid=5288

一句話,這題目就是考智商的題。。。可憐我這個新手智商低~T_T

言歸正傳:題意很容易理解,就是講一個數組的可以組成的所有區間的,該區間所有不能整除該區間其他數的個數的和。

解決辦法就是:找到一個數的左右最近的兩個值恰好為該數的因子的位置分別為L[i],R[i],那麽在區間(L[i],R[i])內a[i]是該區間的一個所有數的值都不能整除該數的值。所以a[i]可以作為答案的個數為(L[i]-i)*(i-R[i])

先寫個超時的~

#include<stdio.h>
#include
<string.h> int summary(); int L[100010],R[100010],a[100010],n; int main(){ freopen("1001.in","r",stdin); while(scanf("%d",&n)!=EOF){ memset(a,0,sizeof(a)); memset(L,0,sizeof(L)); memset(R,0,sizeof(R)); for(int i=0;i<n;i++){ scanf("
%d",&a[i]); L[i]=R[i]=i; } printf("%I64d\n",summary()); } } int summary(){ int sum=0; for(int i=0;i<n;i++){ for(int j=i-1;j>=0;j--){ L[i]=j; if(a[i]%a[j]==0){ break; }
if(j==0)L[i]=j+1; } for(int j=i+1;j<n;j++){ R[i]=j; if(a[i]%a[j]==0){ break; } if(j==n-1)R[i]=j+1; } if(i==0)sum+=(R[i]-i)%1000000007; else if(i==n-1) sum+=i-L[i]%1000000007; else sum+=(i-L[i])*(R[i]-i)%1000000007; // printf("%d %d %d %d\n",sum,L[i],R[i],i); } return sum; }

HDU5288——OO’s Sequence(2015多校-1001)