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. Codeforces Round #373 (Div. 1)

    Codeforces Round #373 (Div. 1) A. Efim and Strange Grade 题意 给一个长为\(n(n \le 2 \times 10^5)\)的小数,每次可以选 ...

  2. C++@重载函数

    关于重载详细分析参考: http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html 内部机制涉及重载函数如何解决命名冲突,调用匹配的问题 ...

  3. 科普:浅谈 Hellinger Distance

    浅谈 Hellinger Distance 2016.05.24 最近在看 Hellinger Distance(海林格距离), 平时看多了欧式距离,马氏距离等等,貌似介绍这个的材料不是很多,例如:维 ...

  4. linux 大并发下 内核优化

     To support over 500k users, you *need* - A 64 bits hardware/kernel (AMD64, Opterons) - At least 8GB ...

  5. -aborted-exception-during-the-exce

    http://stackoverflow.com/questions/20988445/how-to-avoid-response-end-thread-was-being-aborted-excep ...

  6. HashMap的原理与实 无锁队列的实现Java HashMap的死循环 red black tree

    http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html https://zh.wikipedia.org/wiki/%E7%BA ...

  7. 异构平台同步(Mysql到Oracle)

    Oracle GoldenGate学习之--异构平台同步(MySQL到Oracle) 如图所示:源端采用Mysql库,目标端采用Oracle库 一.OGG安装配置(源端) 1.OGG下载 https: ...

  8. 在CentOS上安装Python

    首先我们需要在服务器上安装一个比较新的 Python,CentOS 5.8 默认装的 Python 是 2.4.3. [root@nowamagic ~]# python -V Python 我们需要 ...

  9. ABBYY PDF Transformer+ Pro支持全世界189种语言

    ABBYY PDF Transformer+ Pro版支持189种语言,包括我们人类的自然语言.人造语言以及正式语言.受支持的语言可能会因产品的版本不同而各异.本文具体列举了所有ABBYY PDF T ...

  10. entity framework里的继承映射关系TPH、TPT和TPC

    本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...