【瞎搞】HDU 4961 Boring Sum

来源:互联网 发布:直销矩阵制示意图 编辑:程序博客网 时间:2024/05/11 02:41

题意:给出一串数列 a[1],a[2].....a[n];

所谓的b[i]是在a[i]的左边的倍数的值,c[i]是在a[i]的右边的倍数的值 

若左边或右边没有倍数则是它本身

求sum=b[1]*c[1]+....b[n]*c[n];

思路:

先预处理出1-100000的约数下来。。

再用一个next数组储存这个数最近的倍数


再从左开始for   则b[i]=next[a[i]];

再更新next数组 

同理得c

#include <stdio.h>#include <string.h>#include <math.h>#include <string>#include <algorithm>#include <vector>using namespace std;#define IN     freopen ("in.txt" , "r" , stdin);#define OUT  freopen ("out.txt" , "w" , stdout);typedef long long  LL;const int M= 100100;vector<int>g[M];LL next[M],b[M],c[M],a[M];int main(){    int n;    for(int i=1;i<=100000;i++)//得到约数    {        g[i].clear();        for(int j=1;j<=(int)sqrt(i*1.0);j++)        {            if(i%j==0)            {                g[i].push_back(j);                g[i].push_back(i/j);            }        }    }  //  IN;    while(scanf("%d",&n),n)    {        memset(next,-1,sizeof(next));        for(int i=1;i<=n;i++)            scanf("%I64d",&a[i]);        for(int i=1;i<=n;i++)//得到b        {            b[i]=-1;            b[i]=max(b[i],next[a[i]]);            if(b[i]==-1)                b[i]=a[i];            for(int j=0;j<g[a[i]].size();j++)//更新next            {                next[g[a[i]][j]]=a[i];            }        }        memset(next,-1,sizeof(next));        for(int i=n;i>=1;i--)        {            c[i]=1100000;            if(next[a[i]]!=-1)                c[i]=min(c[i],next[a[i]]);            if(c[i]==1100000)                c[i]=a[i];            for(int j=0;j<g[a[i]].size();j++)            {                next[g[a[i]][j]]=a[i];            }        }        LL sum=0;        for(int i=1;i<=n;i++)            sum+=b[i]*c[i];        printf("%I64d\n",sum);    }    return 0;}


0 0
原创粉丝点击