题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5288

 //*************头文件区*************
 #include<iostream>
 #include<cstdio>
 #include<vector>
 #define N 100010
 #define P 1000000007
 using namespace std;
 int n,tmp,i,j;
 int r[N], l[N], q[N], a[N];
 long long a1,a2,sum;
 vector<int> vec[10010];
 int main()
 {
     freopen("1001.in","r",stdin);
     freopen("m1001.out","w",stdout);
     while(~scanf("%d",&n)){
         for( i = 101; i <= 10000; ++i)
             vec[i].clear();
 //          清空容器
         for( i = 1; i <= n; ++i){
             scanf("%d",&a[i]);
             l[i] = 0;
             r[i] = n+1;
             if( a[i] > 100)
                 vec[a[i]].push_back(i);
 //          数据初始化,超过100的数据将下标保存到vec[a[i]]内
         }
         for( j = 1; j <= 100; ++j){
             tmp = 0;
 //          暂时保存下标
             for( i = 1;i <= n; ++i){
                 if( a[i] % j ==0 )
                     l[i] = max(tmp,l[i]);
                 if( a[i] == j)
                     tmp = i;
             }
             tmp = n+1;
             for( i = n;i >= 1; --i){
                 if( a[i] % j ==0)
                     r[i] = min(tmp,r[i]);
                 if( a[i] == j)
                     tmp = i;
             }
 //          更新以100以内的数为约数的数的左右限制
         }

         for( i = 101; i <= 10000; ++i)
             q[i] = vec[i].size() - 1;
         for( i = n; i >= 1; --i){
             if(a[i] > 100){
                 for( j = a[i]; j <=  10000; j = j+a[i]){
                     while((q[j] >= 0)&&(vec[j][q[j]]>i)){
                         l[vec[j][q[j]]] = max(l[vec[j][q[j]]],i);
                         if((q[j] > 0)&&(vec[j][q[j]-1]>i))
                             q[j]--;
                         else
                             break;
                     }
                 }
             }
         }
         for( i = 101; i <= 10000; ++i)
             q[i] = 0;
 //          vec下标从0开始?
         for( i = 1; i <= n; ++i)
             if(a[i] > 100){
                 for( j = a[i]; j <=  10000; j = j+a[i]){
                     while((q[j]<vec[j].size())&&(vec[j][q[j]]<i)){
                         r[vec[j][q[j]]] = min(r[vec[j][q[j]]],i);
                         if((q[j]<vec[j].size()-1)&&(vec[j][q[j]+1]<i))
                             q[j]++;
                         else
                             break;
                     }
                 }
             }

         sum=0;
         for (i=1;i<=n;i++)
         {
             a1=r[i]-i;
             a2=i-l[i];
             sum=(sum+a1*a2)%P;
 //            printf("%lld\n",a1);
         }
        printf("%I64d\n",sum);
     }
 }

hdoj 5288 OO’s Sequence的更多相关文章

  1. 思维题 HDOJ 5288 OO’s Sequence

    题目传送门 /* 定义两个数组,l[i]和r[i]表示第i个数左侧右侧接近它且值是a[i]因子的位置, 第i个数被选择后贡献的值是(r[i]-i)*(i-l[i]),每个数都枚举它的因子,更新l[i] ...

  2. HDOJ 5288 OO’s Sequence 水

    预处理出每一个数字的左右两边能够整除它的近期的数的位置 OO's Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 13 ...

  3. HDU 5288 OO’s Sequence [数学]

     HDU 5288 OO’s Sequence http://acm.hdu.edu.cn/showproblem.php?pid=5288 OO has got a array A of size ...

  4. HDU 5288 OO‘s sequence (技巧)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5288 题面: OO's Sequence Time Limit: 4000/2000 MS (Jav ...

  5. HDU 5288 OO’s Sequence 水题

    OO's Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5288 Description OO has got a array A ...

  6. HDU 5288——OO’s Sequence——————【技巧题】

    OO’s Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

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

    OO's Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  8. hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)

    OO's Sequence                                                          Time Limit: 4000/2000 MS (Jav ...

  9. 【HDOJ】5288 OO’s Sequence

    二分寻找对于指定pos的最左因数点和最右因数点. /* 5288 */ #include <iostream> #include <string> #include <m ...

随机推荐

  1. Oracle RAC 负载均衡测试(结合服务器端与客户端)

    Oracle RAC 负载均衡使得从客户端发起的连接能够有效地分配到监听器负载较小的实例上.有两种方式实现客户端负载均衡,一是通过配置客户端的load_balance,一是通过配置服务器端的remot ...

  2. ubuntu下 apt-get install 下载的文件存放的目录

    apt-get把下载的deb包全部放在/var/cache/apt/archives下面,该目录下的文件可以删除.当然用 sudo apt-get clean 命令也可以,这个命令只会删除缓存起来的d ...

  3. [转] C# TextBox、DataGrideView中的数据绑定

    Xavierr 原文 C#数据绑定——简单的文本框绑定.DataGridView 一.TextBox的数据绑定 经常写用一个TextBox显示某个对象,然后编辑之后再保存的程序.以前都是在TextBo ...

  4. HDU5808Price List Strike Back (BestCoder Round #86 E) cdq分治+背包

    严格按题解写,看能不能形成sum,只需要分割当前sum怎么由两边组成就好 #include <cstdio> #include <cstring> #include <c ...

  5. Jmeter介绍

    一.添加线程组 一个性能测试请求负载是基于一个线程组完成的.一个测试计划必须有一个线程组.测试计划添加线程组非常简单.在测试计划右键弹出下拉菜单(添加-->Threads(Users)---&g ...

  6. Leetcode 225 Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  7. WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5

    以下是我的程序(取自headfirst Java): import javax.sound.midi.*; public class MiniMiniMusicApp { public static ...

  8. Sublime Text 3快捷键

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...

  9. linux c下mysql编程样例

    /* ============================================================================ Name : mysql1.c Auth ...

  10. python测试api接口

    在开发中,需要测试web-api的接口 spring mvc 使用单元测试非常方便,但是,受不了单元测试的启动速度.用python写了一个小脚本,用于测试接口, 测试脚本配置文件 api.yaml s ...