2015 多校赛 1001 (hdu 5288)

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 a imod a j=0,now OO want to know [∑i=1n ∑j=i n f(i,j) ] mod (10^9+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 a i(0<a i<=10000)

Output

For each tests: ouput a line contain a number ans.

Sample Input

5
1 2 3 4 5

Sample Output

23

题意:给出长度为n的数列,设函数f(i,j)表示,在a[i]到a[j]中,其中i<=ti<=j,满足a[ti]%a[tj]!=0的ti的个数,其中tj为不等于ti的任意 i 到 j 中的数。

求出 [∑i=1n ∑j=i n f(i,j) ] mod (10^9+7)。

思路:对于数列中的每一个数,求出其被所有可行区间包含的次数。

代码与注释如下。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=10005,maxx=100005;
const long long mod=1000000007;
vector<int>divi[maxn];
int a[maxx],l[maxx],r[maxx],pos[maxn],n;
void ini(){
    for(int i=1;i<=10000;i++)
        for(int j=1;j<=i;j++)
            if(i%j==0) divi[i].push_back(j);
    //预处理出10000内所有数的因子
}
int main(){
    ini();
    while(~scanf("%d",&n)){
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        memset(l,-1,sizeof(l));
        memset(r,0x3f,sizeof(r));
        memset(pos,-1,sizeof(pos));
        //l[i]表示a[i]左边与之最接近的它的因子的下标
        for(int i=0;i<n;i++){
            int lef=-1;
            for(int j=0;j<divi[a[i]].size();j++)
                lef=max(lef,pos[divi[a[i]][j]]);
            pos[a[i]]=i;
            //pos数组用于更新维护最靠近a[i]的因子数的下标
            l[i]=lef;
        }
        memset(pos,0x3f,sizeof(pos));
        //r[i]表示a[i]右边与之最接近的它的因子的下标
        for(int i=n-1;i>=0;i--){
            int rig=0x3f3f3f3f;
            for(int j=0;j<divi[a[i]].size();j++)
                rig=min(rig,pos[divi[a[i]][j]]);
            pos[a[i]]=i;
            //pos数组用于更新维护最靠近a[i]的因子数的下标
            r[i]=rig;
        }
        long long ans=0,L,R;
        for(int i=0;i<n;i++){
            if(l[i]==-1) L=i+1;
            //若为原值,则说明a[i]左边不存在因子
            else L=i-l[i];
            //否则,令L为a[i]到其因子右边第一个数之间的个数
            if(r[i]==0x3f3f3f3f) R=n-i;
            else R=r[i]-i;
            ans=(L*R%mod+ans)%mod;
            //L*R为包含a[i]的连续区间的组合数。
        }
        printf("%d\n",ans);
    }
    return 0;
}

时间: 2024-10-22 18:11:41

2015 多校赛 1001 (hdu 5288)的相关文章

2015 多校赛 1002 (hdu 5289)

Description Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this company, and every staff has a ability. Now, Tom is going to assign a special task to some staffs who were in the same group. In a group, the

2015.4 校赛回顾

用了一下午时间重刷了一次校赛题目 不参考资料做的还是2333 第一题手速题 第二题 一开始取余运算少加了一个,WA了一发 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { int i,d[20000]; string c; memset(d,0,sizeof(d)); while(cin>>c) { int n=0; for(i=0;

2015 GDUT校赛

周末打了个GDUT的校赛,也是作为SCAU的一场个人排位. 比赛中竟然卡了个特判,1个半钟就切了5条了,然后一直卡. 还有其他两条可以做的题也没法做了,性格太执着对ACM来说也是错呀. 讲回正题 . A  游戏王 . 目的是集齐6张卡, 然后n个小伙伴手上持有卡num, 给出m种集合 , Stubird需要有某个集合中的卡片才能用c的花费去买这张卡片. 做法是状压dp , 开一个 dp[st] , 表示st( 0 <= st < (1<<6) ) 这个集合最小花费 . 然后开一个邻

2015 多校赛 第五场 1010 (hdu 5352)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5352 看题看得心好累. 题目大意: 给出 n 个点,依次执行 m 次操作:输入“1 x”时,表示将与 x 连通的点全部修复:输入“2 x y”,表示在 x 与 y 之间加一条边:输入“3 x y”,表示删除 x 与 y 之间的边.题目确保不会与重边并且操作合法. 题目会给出 k,要求每次修复的的点的数目小于等于k. 问:怎样执行操作1,使得令修复点数最多的同时,令每次执行操作1所修复的点的数目所构成

2015 多校赛 第一场 1007 (hdu 5294)

总算今天静下心来学算法.. Description Innocent Wu follows Dumb Zhang into a ancient tomb. Innocent Wu’s at the entrance of the tomb while Dumb Zhang’s at the end of it. The tomb is made up of many chambers, the total number is N. And there are M channels connect

2015 多校赛 第五场 1009 (hdu 5348)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题目大意:给出一幅无向图,问是否存在一种方案,使得给每条边赋予方向后,每个点的入度与出度之差小于等于1.如不存在,输出-1:存在,则按边的输入顺序输出方向. 比如:若给出第 m 条边为 u,v,则在对应第m行输出0表示u->v,输出1表示u<-v. 解题思路: 首先证明一定可以构造出符合要求的图. 对于一个环,显然可以使得其内的每个点入度与出度相等.之后可以把环看成点. 对于一棵树,则可以通

2015 多校赛 第四场 1010 (hdu 5336)

Problem Description XYZ is playing an interesting game called "drops". It is played on a r∗c grid. Each grid cell is either empty, or occupied by a waterdrop. Each waterdrop has a property "size". The waterdrop cracks when its size is

2015 多校赛 第四场 1009 (hdu 5335)

Problem Description In an n∗m maze, the right-bottom corner is the exit (position (n,m) is the exit). In every position of this maze, there is either a 0 or a 1 written on it. An explorer gets lost in this grid. His position now is (1,1), and he want

2015 多校赛 第二场 1006 (hdu 5305)

Problem Description There are n people and m pairs of friends. For every pair of friends, they can choose to become online friends (communicating using online applications) or offline friends (mostly using face-to-face communication). However, everyo