最后一场多校 hdu 5288 OO’s Sequence

来源:互联网 发布:js初学者 买哪本书 编辑:程序博客网 时间:2024/06/08 07:03

题意就是计算给出的公式

我用的l[i]表示ai向前碰到的第一个因子位置用r[i]表示ai向后碰到的第一个因子位置

然后ai能被加的次数就是(i-l[i]-1)*(r[i]-i)+(r[i]-i-1)+1,一个遍历加完就ok了


#include<iostream>#include<sstream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<stack>#include<math.h>#include<map>#include<time.h>#include<set>#include<string>#include<vector>#include<algorithm>using namespace std;#define inf 0x7fffffff#define lc l,m,index<<1#define rc m+1,r,index<<1|1#define max_n 100005#define mod  1000000007#define LL  unsigned long long#define max_log 20int kep[max_n];int l[max_n];int r[max_n];int vis[max_n];void init(){    for(int i=0;i<=100000;i++)    vis[i]=-2;}int main(){int n;while(~scanf("%d",&n)){    LL ans=0;    for(int i=0;i<n;i++)    {        l[i]=-1;        r[i]=n;            scanf("%d",&kep[i]);    }        init();    for(int i=0;i<n;i++)    {        if(vis[kep[i]]!=-2)        l[i]=vis[kep[i]];        for(int j=1;j*kep[i]<=10000;j++)            vis[j*kep[i]]=i;    }    init();    for(int i=n-1;i>=0;i--)    {        if(vis[kep[i]]!=-2)        r[i]=vis[kep[i]];        for(int j=1;j*kep[i]<=100000;j++)            vis[j*kep[i]]=i;    }    for(LL i=0;i<n;i++)        ans=(ans+(i-l[i]-1)*(r[i]-i)+(r[i]-i-1))%mod;    ans=(ans+n)%mod;    printf("%lld\n",ans);}return 0;}


0 0