Problem Description
OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know

∑i=1n∑j=inf(i,j) mod (109+7).
 
Input
There are multiple test cases. Please process till EOF.
In each test case: 
First line: an integer n(n<=10^5) indicating the size of array
Second line:contain n numbers ai(0<ai<=10000)
 
Output
For each tests: ouput a line contain a number ans.
 
Sample Input
5
1 2 3 4 5
 
Sample Output
23
 
Author
FZUACM
 
Source
 
 
 
 
题意:函数f(l,r)表示区间l,r中,不是区间中其他所有数的倍数的数的个数
 
直接暴力显然是不可以的
 
思路:
1.预处理出1~1e5每一个数的所有因子,O(nsqrt(n))
2.数组l[i],r[i],分别表示从i开始最左能够到达的位置和最右能够达到的位置,使得[l[i],r[i]]中,i不是任何数的倍数
 
 
 
那么现在就是求出l,r的问题了
pos[i]表示i在数组中出现的位置
 
对于a[i],我们枚举a[i]的所有因子,对于每一个因子,我们已经知道这个因子在数组中出现的位置,二分,然后更新l[i],r[i]
 
求出l,r数组后,
对于每一个数a[i],对答案的贡献=(i-l[i]+1)*(r[i]-i+1)
 
就可以了
 
 
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector> #define LL long long
#define pb push_back using namespace std; const int maxn=1e5+;
const int mod=1e9+;
const int inf=0x3f3f3f3f; int a[maxn];
int l[maxn];
int r[maxn];
vector <int> di[maxn];
vector <int> pos[maxn]; void pre_init()
{
for(int i=;i<maxn;i++){
for(int j=;j*j<=i;j++){
if(i%j==){
di[i].pb(j);
if(i/j != j)
di[i].pb(i/j);
}
}
}
} void init(int n)
{
for(int i=;i<maxn;i++){
pos[i].clear();
}
} void solve(int ); int main()
{
pre_init(); int n;
while(~scanf("%d",&n)){
init(n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
pos[a[i]].pb(i);
}
solve(n);
}
return ;
} void solve(int n)
{
for(int i=;i<=n;i++){
l[i]=,r[i]=n;
} for(int i=;i<=n;i++){
for(int j=;j<di[a[i]].size();j++){
int k=di[a[i]][j]; int left=,right=pos[k].size()-; if(right<left)
continue; if(pos[k][left]<i){
while(right-left>){
int mid=(left+right)>>;
if(pos[k][mid]>=i)
right=mid;
else
left=mid;
}
if(pos[k][right]<i)
l[i]=max(l[i],pos[k][right]+);
else
l[i]=max(l[i],pos[k][left]+);
} left=,right=pos[k].size()-;
if(pos[k][right]>i){
while(right-left>){
int mid=(left+right)>>;
if(pos[k][mid]<=i)
left=mid;
else
right=mid;
}
if(pos[k][left]>i)
r[i]=min(r[i],pos[k][left]-);
else
r[i]=min(r[i],pos[k][right]-);
} }
} /*
for(int i=1;i<=n;i++)
printf("%d %d\n",l[i],r[i]);
*/ LL ret=;
for(int i=;i<=n;i++){
ret+=(i-l[i]+)*(r[i]-i+)%mod;
ret=(ret+mod)%mod;
} printf("%I64d\n",ret);
return ;
}
 
 
 
 
 
 
 
 
 
 
 

hdu 5288 OO’s Sequence 枚举+二分的更多相关文章

  1. HDU 5288 OO’s Sequence [数学]

     HDU 5288 OO’s Sequence http://acm.hdu.edu.cn/showproblem.php?pid=5288 OO has got a array A of size ...

  2. HDU 5288 OO‘s sequence (技巧)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5288 题面: OO's Sequence Time Limit: 4000/2000 MS (Jav ...

  3. HDU 5288 OO’s Sequence 水题

    OO's Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5288 Description OO has got a array A ...

  4. HDU 5288——OO’s Sequence——————【技巧题】

    OO’s Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  5. hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)

    OO's Sequence                                                          Time Limit: 4000/2000 MS (Jav ...

  6. Hdu 5288 OO’s Sequence 2015多小联赛A题

    OO's Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  7. hdu 5288 OO’s Sequence(2015多校第一场第1题)枚举因子

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5288 题意:在闭区间[l,r]内有一个数a[i],a[i]不能整除 除去自身以外的其他的数,f(l,r ...

  8. hdu 5288 OO’s Sequence(计数)

    Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...

  9. HDU 5288 OO’s Sequence

    题意:给一个序列,函数f(l, r)表示在[l, r]区间内有多少数字不是其他数字的倍数,求所有区间的f(l, r)之和. 解法:第一次打多校……心里还有点小激动……然而一道签到题做了俩点……呜呜呜… ...

随机推荐

  1. mysql创建用户和创建数据库赋值用户操作权限

    mysql 进入mysqldb SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; ...

  2. OOP作业

    1,定义一个水果类(fruit),水果类中的有[属性]:颜色(color).价格(price).重量(weigth),再定义一个<测试类>,创建一个苹果(apple)的对象, 颜色是&qu ...

  3. Python学习(5)——内置函数

    常用字符串内置函数 1)str.count() //返回该字符串中某个子串出现的次数 2)str.find() //返回某个子串出现在该字符串的起始位置 3)str.lower() //将该字符串全部 ...

  4. poj3259 最短路判环

    题意:有一些点.一些道路和一些虫洞,道路是双向的,连接两点,花费正的时间,而虫洞是单向的,连接两点,可以使时间倒退,求是否能够回到过去. 只要明确回到过去其实就是当出现一个负环的时候,不断沿这个环走, ...

  5. mysql optimization

    EXPLAIN 命令详解 http://www.cnblogs.com/gomysql/p/3720123.html http://www.cnblogs.com/Aiapple/p/5697229. ...

  6. Python字典笔记

    1.字典是Python中=唯一的映射类型.映射类型对象里哈希值(键,key)和只指向的对象(值,value)是一对多的关系,一个字典是可变的,是一个容器类型.字典类型和序列类型(元组,列表)的不同在于 ...

  7. ABBYY FineReader出现错误代码258

    ABBYY FineReader 12OCR文字识别软件能够快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索的文本,包括Word.Excel.文本文档.PPT等格式,受到不少用 ...

  8. shell脚本实例-菜单样例

    1.9.1 实例需求 用户在进行Linux系统管理的过程中,经常需要用到查看进程的信息.用户的信息等常用的功能.本例针对这一需求,使用shell编程实现基本的系统管理 功能.通过本程序,可以按照要求实 ...

  9. css3写出0.5px的边框

    一说到0.5px的边框,我们一般认为是不行的,因为在ps中0.5px的线也是做不出来的,这个计算机的像素有关系. 废话不多说了,0.5px 其实用的是css3新特性,box-shadow:阴影设置 代 ...

  10. SharePoint 2010 最佳实践学习总结------第2章 SharePoint Windows PowerShell指南

    第2章 SharePoint Windows PowerShell指南 SharePoint 2010是SharePoint系列产品中第一个开始支持Windows PowerShell的产品,在以前的 ...