【遍历枚举】hdu 5288 OO’s Sequence
来源:互联网 发布:淘宝鞋子店铺排行榜 编辑:程序博客网 时间:2024/05/29 02:19
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5288
题意:给出一个序列,计算所有满足:存在ai使的区间内不存在ai的倍数的区间个数和
分析:从ai先两端找到不是ai倍数的两个端点了,li,ri。sum(i)=(loc(ai)-li)*(ri-loc(ai));
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100000+10;
const int maxh=10000+10;
const int mode=1000000007;
int num[maxn],r[maxn],l[maxn];
int rr[maxh],ll[maxh];
vector<int>vec[maxh];
void init()
{
for(int i=1;i<=10000;i++)//计算出10000以内每个输的倍数
for(int j=1;j*j<=i;j++)
{
if(!(i%j))
{
vec[j].push_back(i);
if(j*j!=i)
vec[i/j].push_back(i);
}
}
}
int main()
{
int n;
long long int sum;
init();
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<=10000;i++)
{
ll[i]=0;
rr[i]=n+1;
}
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int i=1;i<=n;i++)//找到每个数的做端点
{
l[i]=ll[num[i]];
int h=vec[num[i]].size();
for(int j=0;j<h;j++)
ll[vec[num[i]][j]]=i;
}
for(int i=n;i>=1;i--)//找到每个数的又端点
{
r[i]=rr[num[i]];
int h=vec[num[i]].size();
for(int j=0;j<h;j++)
rr[vec[num[i]][j]]=i;
}
sum=0;
for(int i=1;i<=n;i++)
{
sum+=(i-l[i])*(r[i]-i);
if(sum>=mode)
sum%=mode;
}
printf("%I64d\n",sum);
}
return 0;
}
- 【遍历枚举】hdu 5288 OO’s Sequence
- hdu 5288 OO’s Sequence 枚举因数
- HDU 5288 OO’s Sequence (暴力枚举因子)
- hdu 5288OO’s Sequence
- hdu 5288 OO’s Sequence
- hdu 5288 OO’s Sequence
- hdu 5288 OO’s Sequence
- hdu 5288 OO’s Sequence
- HDU 5288 OO’s Sequence
- hdu 5288 OO’s Sequence
- hdu 5288 OO’s Sequence
- HDU 5288 OO’s Sequence
- hdu 5288 OO’s Sequence
- hdu 5288 OO’s Sequence
- HDU 5288 OO’s Sequence
- HDU 5288 OO’s Sequence
- 【瞎搞】HDU 5288 OO’s Sequence
- HDU 5288 OO’s Sequence 区间个数
- 转 Java类加载的延迟初始化
- XAMPP+Mantis安装步骤
- 简易计算器
- vnc连接Linux服务器蓝屏的解决
- Codeblocks改文本颜色
- 【遍历枚举】hdu 5288 OO’s Sequence
- 1.JAXB注解
- 人际关系
- Android开发之MediaRecorder类详解
- 谈谈final, finally, finalize的区别
- 明月半倚深秋
- redis的key的过期机制
- 新博客地址
- java垃圾回收器