zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    select选中值传递到后台action中
    select into from 与insert into select from区别
    存储过程
    layer
    下拉框两级联动
    无限纠结——Zedboard上跑ubuntu详解
    静态时序分析SAT
    设计模式-(构型模式)
    内存断点调试的原理
    C语言中使用静态函数的好处
  • 原文地址:https://www.cnblogs.com/Yvettey-me/p/4674386.html
Copyright © 2011-2022 走看看