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

 
 
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
 
题意:给你n个数,让你找出各个区间内不被任何a[j]整除的i的个数,并输出所有区间的个数和。
举个栗子,样例数据就是
f(1,1)f(1,2)f(1,3)f(1,4)f(1,5)
f(2,2)f(2,3)f(2,4)f(2,5)
f(3,3)f(3,4)f(3,5)
f(4,4)f(4,5)
f(5,5)
这些区间内的不被任何a[j]整除的个数
因为题目a[i]%a[j]==0,i!=j,
所以f(1,1) 里面有一个 1,因为i!=j;
f(1,2) 里面有一个1,因为2%1==0
以此类推 f(1,3) f(1,4) f(1,5) 都是 1
f(2,2) 一个
f(2,3) 两个 2 和 3 因为有两个数i可以不等于j
以此类推相信题意已经懂了
当初我就是被题意杀了,还狂做三小时,一丝悲凉>_<
 
思路:既然他给的是求每个数不被其他的数整除的区间个数,说明这个区间里面肯定包含a[i]
然后我们把每个数所包含的区间全部弄出来,当然要符合条件没有可以整除a[i]的数的区间,就是大佬们讲的求每个数的贡献,看他贡献几个区间,包含这个数的区间他能贡献出来几个
重点!!我们找a[i]左边的最近的可以整除a[i]的数的位置,再找右边的
举个栗子,比如 1 3 4 3 1
我们当前在枚举中间那个2
左边我们找到了位置1的1,右边找到了位置6的1
现在一个公式 (i-left)*(right-i) 就是该区间内所有区间种数,并且没有可以整除a[j]的数
意思就是1 3 4 2 3 1  因为两边都是最近的可以整出的,所以中间肯定都是满足要求的,然后这个公式懂了意思自己也能推出来,不过特别要注意 2 2这个区间,所以公式里面两边都包含了中间这个2
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<map>
#define MOD 1000000007
using namespace std;
int a[];
int l[];//记录每个数的左边最接近得可整除的数的位置
int r[];//记录每个数的右边最接近得可整除的数的位置
int mp[];//记录之前出现过的数,判断是否是整除的数的标记数组,存的是那个数的位置
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
memset(mp,,sizeof(mp));
for(int i=;i<=n;i++)//找左边最接近的数
{
l[i]=;
for(int j=;j*j<=a[i];j++)//判断这个数是否被整除,取到根号就好
{
if(a[i]%j==)
{
if(mp[j]) l[i]=max(mp[j],l[i]);
if(mp[a[i]/j]) l[i]=max(mp[a[i]/j],l[i]);//这个是以根号为界限的右边的因子数,自己推导一下
}
}
mp[a[i]]=i;//出现过的数记录一下
}
memset(mp,,sizeof(mp));
for(int i=n;i>=;i--)找右边最接近的数
{
r[i]=n+;
for(int j=;j*j<=a[i];j++)
{
if(a[i]%j==)
{
if(mp[j]) r[i]=min(mp[j],r[i]);
if(mp[a[i]/j]) r[i]=min(mp[a[i]/j],r[i]);
}
}
mp[a[i]]=i;
}
long long sum=;
for(int i=;i<=n;i++)
{
sum+=(i-l[i])*(r[i]-i);//公式算每个数的贡献区间个数多少
}
printf("%lld\n",sum%MOD);
}
}

我个人觉得比赛的时候要有能力分清这个是否是一个求贡献的题目,下面讲下个人理解,我觉得如果一件事必须要这个成员参与

,而且有很多这类的的事,并且题目是要求每个个数之和之类的就是求贡献题

也是个人一些推断,希望对你们有用,

下面最后说一句,搞acm的小菜鸡绝不服输>_<`

hdu 5228 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 2167 状压dp方格取数

    题意:给出一个数表,规定取出一个数后周围的八个数都不可取,求可获得的最大数字和 思路:状态压缩dp,每一行的取数方法为状态,显然,由于取数规则的限制,可取的状态并不是 1<<size_co ...

  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(计数)

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

随机推荐

  1. WinForm下窗体权限设计

    权限设计   笔者不才看了园子里面很多园友写关于权限设计这块内容,那么笔者也在添一笔.这个是笔者在上完软件工程课程后,上交的一篇笔者论文,这里分享给大家交流,当然笔者经验尚浅,若内容有误,请大家指点出 ...

  2. You Don't Know JS: this & Object Prototypes (第6章 Behavior Delegation)附加的ES6 class未读

    本章深挖原型机制. [[Prototype]]比类更直接和简单! https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%2 ...

  3. 从华为数字化转型看IT自动化运维重要性

    关注嘉为科技,获取运维新知 8月有幸聆听了华为CIO陶总(陶景文)关于“华为数字化转型秘诀:坚定“以客户为中心”的思想”的演讲,获益良多.其中陶总也分享了IT运营平台的建设对于华为实现数字化转型的重要 ...

  4. PHP单例模式实例,连接数据库对类的引用

    <?php//单例模式连接数据库class pzhang{ static private $instance; private static $config; private $dbase = ...

  5. mysqli的使用

    <?php /** 数据库连接 **/ $conn=mysqli_connect('localhost:3306','root','root'); if(!$conn){ die("c ...

  6. CF903G Yet Another Maxflow Problem

    考虑最大流=最小割 不妨把a到a的边称为a类边,b到b的称为b类边,a到b的称为c类边. 显然,答案一定是由最多1条a和最多一条b以及一些c组成的. 只有a是会变的,也就是说每个a对应了唯一的最优的b ...

  7. use . adb . get wifi

    adb shell 连接手机获取root权限,如果返回的字符串中不包含root字样,再输入su命令回车 继续输入cat /data/misc/wifi/*.conf命令,将会把文件打印出来 ssid表 ...

  8. Symmetric Tree leetcode java

    问题描述: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...

  9. python记录_day04 列表 元组

    今日主要内容: 列表 和 元组 列表 一.列表介绍 列表是一种能存储大量数据的数据结构,是能装对象的对象.由方括号 [] 括起来,能放任意类型的数据,数据之间用逗号隔开 列表存储数据是有顺序的 二.增 ...

  10. 【PowerDesigner】【1】简单介绍

    正文: 创建表格 File→New Model→(Model types; Physical Data Model; Physical Diagram)Model name:名称:DBMS:数据库类型 ...