Problem Description
  1. 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
  2. ∑i=1n∑j=inf(i,j) mod (+).
Input
  1. There are multiple test cases. Please process till EOF.
  2. In each test case:
  3. First line: an integer n(n<=^) indicating the size of array
  4. Second line:contain n numbers ai(<ai<=)
Output
  1. For each tests: ouput a line contain a number ans.
Sample Input
Sample Output
  1.  
Author
FZUACM
 
 
Source
 

题意:

本来的题意问  枚举所有i,j ,1<=i<=j<=n,  然后计算f(i,j)和是多少。

f(l,r)的值 是 输入的数组下标 l到r中有多少 数是无法被这个区间 任意一个数整除的。 

 

做法:

转换种思想就是 某个数num[i],在多少个区间内 可以不被区间其他任何数整除。  答案加上区间个数。

所以 可以左右两边枚举过来。

以左边枚举过来为例:

把最近出现的数 记录下来,记录到 has数组。   如num[i]      记录成has[num[i]]=i     

 

然后把每个数的因子枚举,判断最近左边出现因子在哪。  然后那个位子+1 就是左端点了。

 

在同样处理出右端点, 左右端点知道就很容易算出num[i]在多少区间内符合要求 加到ans里。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<cmath>
  7. #include<stdlib.h>
  8. #include<map>
  9. #include<vector>
  10. using namespace std;
  11. #define N 100006
  12. #define M 10006
  13. #define MOD 1000000007
  14. int n;
  15. int vis[M];
  16. int a[N];
  17. vector<int> G[M];
  18. int L[N];
  19. int R[N];
  20. void init(){
  21. for(int i=;i<M;i++){
  22. for(int j=;j<=i;j++){
  23. if(i%j==){
  24. G[i].push_back(j);
  25. }
  26. }
  27. }
  28. }
  29. int main()
  30. {
  31. init();
  32. while(scanf("%d",&n)==){
  33. for(int i=;i<=n;i++){
  34. scanf("%d",&a[i]);
  35. }
  36. memset(vis,,sizeof(vis));
  37. memset(L,-,sizeof(L));
  38. memset(R,-,sizeof(R));
  39. for(int i=;i<=n;i++){
  40. for(int j=;j<G[a[i]].size();j++){
  41. int tmp=G[a[i]][j];
  42. if(vis[tmp]){
  43. if(a[i]%tmp==){
  44. if(L[i]!=-){
  45. L[i]=max(L[i],vis[tmp]+);
  46. }
  47. else{
  48. L[i]=vis[tmp]+;
  49. }
  50. }
  51.  
  52. }
  53. }
  54. vis[a[i]]=i;
  55. }
  56. memset(vis,,sizeof(vis));
  57. for(int i=n;i>=;i--){
  58. for(int j=;j<G[a[i]].size();j++){
  59. int tmp=G[a[i]][j];
  60. if(vis[tmp]){
  61. if(a[i]%tmp==){
  62. if(R[i]!=-){
  63. R[i]=min(R[i],vis[tmp]-);
  64. }
  65. else{
  66. R[i]=vis[tmp]-;
  67. }
  68. }
  69.  
  70. }
  71. }
  72. vis[a[i]]=i;
  73. }
  74. int ans=;
  75. for(int i=;i<=n;i++){
  76. if(L[i]==-){
  77. L[i]=;
  78. }
  79. if(R[i]==-){
  80. R[i]=n;
  81. }
  82. }
  83. for(int i=;i<=n;i++){
  84. ans=(ans+(i-L[i]+)*(R[i]-i+))%MOD;
  85. }
  86. printf("%d\n",ans);
  87. }
  88. return ;
  89. }

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多小联赛A题

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

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

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

  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. 企业生产环境中linux系统分区的几种方案

    方案1:针对网站集群架构中的某个节点服务器分区 该服务器上的数据有多份(其他节点也有)且数据不太重要,建议分区方案如下: /boot: 200MB swap: 物理内存的1.5倍,当内存大于或等于8G ...

  2. 仿糯米弹框效果demo

    代码例如以下: <!doctype html> <html lang="en"> <head> <meta charset="U ...

  3. java实验7-多线程编程

    1 利用Thread和Runnable创建线程 [实验目的] (1)理解用实现Runnable接口的方法实现多线程. (2)掌握线程优先级的设置. (3)加深对线程状态转换的理解. [实验要求] 要求 ...

  4. ubuntu16.04 server安装小记

    由于本人有一台闲置的thinkpad电脑,所以打算在上边安装一个ubuntu16.04 server版本,其中遇到主要问题,做一下记录: 安装过程中出现“ubuntu16.04 server64 bu ...

  5. RDLC报表上下标实现

    例:m的6次方 ="M"&ChrW(8310) Character Name Character Num Entity Hex Entity Superscript Cha ...

  6. oracle启动,提示“LRM-00109: could not open parameter file”

    转载自   http://blog.sina.com.cn/s/blog_53e731b70101liku.html oracle启动,提示“LRM-00109: could not open par ...

  7. ssh maven 搭建

    数据库建表脚本不带,是很简单的一个表,把数据库环境搭建起来即可. 1.项目结构(Eclipse) 2.pom.xml <project xmlns="http://maven.apac ...

  8. BZOJ 2330 SCOI 2011 糖果

    2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友 ...

  9. 重写String类,也有些区别,供参考

    头文件如下: #pragma once #include <string> #include <string.h> #include <stdlib.h> #inc ...

  10. windows应用中调用DLL一步步试验

    试验环境: PC:win10 build 10143 IDE: vs2015 RC WinPhone: win10 build 10136 简单界面,点按钮,算加法 一.主程用C++ 1.新建visu ...