zoukankan      html  css  js  c++  java
  • hdu 5288 OO’s Sequence

    题目大意:

    定义f (L,R)表示下标i在区间内且除了a[i]本身。区间内的其它数都不能整除a[i],这种数的个数。

    如今给出n,和a[1]~a[n],

    i=1~nj=i~(i,j) mod 10^9+7.


    考虑第i个数对结果的贡献:区间[L,R],对于位于当中i的数a[i],假设存在a[i]的因子也在[L,R]内,则数a[i]在该区间内对结果的贡献为0。否则,对结果的贡献为(i-L+1)*(R-i+1)。于是对于处于位置i的数a[i],仅仅要找到左右两边离它近期的它的因子的位置L[i],R[i]。其对结果的贡献就是(i-L[i])*(R[i]-i),即区间的左右端点在区间(L[i],i]、[i,R[i])内时。a[i]才对结果有贡献。这种区间个数为(i-L[i])*(R[i]-i)。


    求L[i],R[i]时。开一个数组pre[i]。用于记录数i上一次出现的位置,初始化为0

    求R[i]:从左到右訪问每个位置i。并用pre[i]标记,对于每个数a[i],看其倍数是否在其之前出现,假设已经出现。那么已经出现的那个数。它的R[i]就是min(R[i],i)。

    相同地,从右向左訪问每个位置i。可得到L[i],

    最后结果累加(i-L[i])*(R[i]-i)就可以。


    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<set>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<cmath>
    #define inf 0x3f3f3f3f
    #define mod 1000000007
    using namespace std;
    typedef long long LL;
    int a[100005],l[100005],r[100005],pre[10005];
    
    int main()
    {
        int i,j,n;
        while(~scanf("%d",&n))
        {
            memset(pre,0,sizeof(pre));
            for(i=1;i<=n;++i){
                scanf("%d",&a[i]);
                l[i]=0;
                r[i]=n+1;
                for(j=a[i];j<=10000;j+=a[i])
                    if(pre[j]&&r[pre[j]]==n+1) r[pre[j]]=i;
                pre[a[i]]=i;
            }
            memset(pre,0,sizeof(pre));
            for(i=n;i>=1;--i){
                for(j=a[i];j<=10000;j+=a[i])
                    if(pre[j]&&l[pre[j]]==0) l[pre[j]]=i;
                pre[a[i]]=i;
            }
            LL ans=0;
            for(i=1;i<=n;++i)ans=(ans+LL(i-l[i])*(r[i]-i)%mod)%mod;
            printf("%lld
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    并发的简单介绍1
    UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section 添加系统默认刷新控件
    UITableView (3):显示cell上的菜单
    TableView(2)
    UITableView (1)
    在 Interface Builder 中配置自动布局的约束
    Velocity 的工作原理
    ORA-01858: a non-numeric character was found where a numeric was expected
    Java 8:不要再用循环了
    Lambda表达式
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7073010.html
Copyright © 2011-2022 走看看