hdu 5288 OO’s Sequence(15多校第一场1001)

来源:互联网 发布:域名虚拟主机哪家好 编辑:程序博客网 时间:2024/06/08 03:43
//15多校第一场 1001 暴力//若有多数需要求因子,且数的范围较小,可以考虑预处理#include<cstdio>#include<algorithm>#include<vector>using namespace std;const int N=100100;int a[N];vector<int>f[10010],vec[10010];const long long M=1000000007;int n;#define MAX(a,b) a<b?b:a#define MIN(a,b) a<b?a:btypedef long long LL;void init(){    for(int i=1;i<=10000;i++)        for(int j=1;j*i<=10000;j++)            f[i*j].push_back(i);}LL find(int pos,int ai){    int l=0,r=n+1;    for(int i=0;i<f[ai].size();i++){        int fac=f[ai][i];        for(int j=0;j<vec[fac].size();j++){            if(vec[fac][j]<pos){                if(l<vec[fac][j])l=vec[fac][j];            }            if(vec[fac][j]>pos){                if(vec[fac][j]<r)r=vec[fac][j];            }        }            }    return (LL)(r-pos)*(pos-l)%M;}int main(){    init();    while(scanf("%d",&n)!=EOF){        for(int i=0;i<=10000;i++)            vec[i].clear();//从1到10000清零        for(int i=1;i<=n;i++){            scanf("%d",&a[i]);            vec[a[i]].push_back(i);//每一个ai的位置        }        long long sum=0;        for(int i=1;i<=n;i++){            sum=(sum+find(i,a[i])%M)%M;        }        printf("%lld\n",sum);    }    return 0;}

0 0
原创粉丝点击