码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5288OO’s Sequence

时间:2015-07-21 20:41:05      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:计数

给你n个数,让你找到所有区间内不能整除其它数的数的个数之和

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int mod = 1e9+7;
#define ll long long
#define N 111111

ll l[N],r[N];//存储左边因子。右边因子的位置
int n,m;
int pre[N],last[N];
int a[N];
int main(){
    while(scanf("%d",&n)==1){
        for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
        l[i]=1;
        r[i]=n;//初始化最左边的因子和最右边的因子都是本身
        }
        memset(pre,0,sizeof(pre));
        memset(last,0,sizeof(last));
        for(int i=1;i<=n;i++){
            for(int j=a[i];j<=10000;j+=a[i])
                if(pre[j]!=0&&r[pre[j]]==n)//如果已经出现并且在右边最近的因子还没有找到
                r[pre[j]]=i-1;
            pre[a[i]]=i;
        }

        for(int i=n;i>0;i--){
            for(int j=a[i];j<=10000;j+=a[i])
                if(last[j]!=0&&l[last[j]]==1)//如果已经出现并且在左边最近的因子还没有找到
                l[last[j]]=i+1;
            last[a[i]]=i;
        }
        /*
        for(int i=1;i<=n;i++){
            printf("%d %d %d\n",i,l[i],r[i]);
        }
        */
        ll ans = 0;
        for(int i=1;i<=n;i++){
            ans = (ans%mod+(ll)(i-l[i]+1)*(r[i]-i+1)%mod)%mod;
        }
        printf("%I64d\n",ans);
    }

}

版权声明:都是兄弟,请随意转载,请注明兄弟是谁

hdu 5288OO’s Sequence

标签:计数

原文地址:http://blog.csdn.net/u013076044/article/details/46990617

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!