【瞎搞】HDU 4961 Boring Sum

题意:给出一串数列 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;
}


posted @ 2014-08-20 09:36  kewowlo  阅读(157)  评论(0编辑  收藏  举报