您的位置:首页 > 产品设计 > UI/UE

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

2015-07-22 19:25 459 查看
//15多校第一场 1001 暴力
//若有多数需要求因子,且数的范围较小,可以考虑预处理
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=100100;
int a
;
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:b
typedef 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: