您的位置:首页 > 其它

hdu 4961 因子

2014-08-19 21:30 204 查看
题意:

叙述好繁琐啊。

给你一个数列,a[i]

b[i],表示在前i项,如果有a[i]的倍数(靠近i的),那么b[i]就等于它了,如果没有找到,那么b[i]=a[i];

c[i],表示在i的后面项,如果有a[i]的倍数,那么c[i]就等于它了,如果没有找到,那么c[i]=a[i];

解法:

从前往后扫描一遍,如果这个数是前面某个数的因子,那么他就等于前面的某个数,如果不是就等于它本身,然后更新他的所有因子,使因子指向它。

同样的道理从后往前扫描一遍。

因为每部都会更新因子的指向,那么一定是更靠近所要找的数。

/*************************************************************************
> File Name: 1002.cpp
> Author: cy
> Mail: 1002@qq.com
> Created Time: 2014/8/19 14:05:36
************************************************************************/

#include<iostream>
#include<cstring>
#include <algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>

#define maxn 100000+5

#define inf 0x3f3f3f3f
#define INF 0x3FFFFFFFFFFFFFFFLL
#define rep(i,n) for(i=0;i<n;i++)
#define reP(i,n) for(i=1;i<=n;i++)

#define ull unsigned long long
#define ll long long

#define cle(a) memset(a,0,sizeof(a))

using namespace std;
int val[maxn];
int used[maxn];
int b[maxn];
int c[maxn];
vector<int>V[maxn];
void init()
{
int i,j,k;
rep(i,maxn)V[i].clear();
V[i].clear();
for(i=1;i<=maxn;i++)
{
for(j=1;j*i<=maxn;j++)
{
V[i*j].push_back(i);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
int n;
init();
while(scanf("%d",&n))
{
if(n==0)break;
int i,j,k;

for(i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
cle(used);
for(i=1;i<=n;i++)
{
if(used[val[i]]==0)
{
b[i]=val[i];
}
else
{
b[i]=used[val[i]];
}
for(j=0;j<V[val[i]].size();j++)
{
used[V[val[i]][j]]=val[i];
}
}
cle(used);
for(i=n;i>=1;i--){
if(used[val[i]]==0)
{
c[i]=val[i];
}
else{
c[i]=used[val[i]];
}
for(j=0;j<V[val[i]].size();j++){
used[V[val[i]][j]]=val[i];
}
}
ll sum=0;
for(i=1;i<=n;i++)
{
sum+=(ll)b[i]*(ll)c[i];
}
printf("%I64d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: