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

Posted yvettey-me

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU5288——OO’s Sequence(2015多校-1001)相关的知识,希望对你有一定的参考价值。

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
",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
",sum,L[i],R[i],i);
    }
return sum;
}

 

以上是关于HDU5288——OO’s Sequence(2015多校-1001)的主要内容,如果未能解决你的问题,请参考以下文章

解题报告 之 HDU5288 OO&#39; s Sequence

Hdu 5288 OO’s Sequence 2015多小联赛A题

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

hdu 5288 OO’s Sequence

多校联合训练第一场OO’s Sequence(hdu5288)

HDOJ 5288 OO’s Sequence 水