您的位置:首页 > 其它

hdu 4961 Boring Sum

2014-08-21 09:31 288 查看

Boring Sum

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 698 Accepted Submission(s):
346


[align=left]Problem Description[/align]
Number theory is interesting, while this problem is
boring.

Here is the problem. Given an integer sequence a1,
a2, …, an, let S(i) = {j|1<=j<i, and aj
is a multiple of ai}. If S(i) is not empty, let f(i) be the maximum
integer in S(i); otherwise, f(i) = i. Now we define bi as af(i).
Similarly, let T(i) = {j|i<j<=n, and aj is a multiple of
ai}. If T(i) is not empty, let g(i) be the minimum integer in T(i);
otherwise, g(i) = i. Now we define ci as ag(i). The
boring sum of this sequence is defined as b1 * c1 +
b2 * c2 + … + bn * cn.

Given
an integer sequence, your task is to calculate its boring sum.

[align=left]Input[/align]
The input contains multiple test cases.

Each
case consists of two lines. The first line contains an integer n
(1<=n<=100000). The second line contains n integers a1,
a2, …, an (1<= ai<=100000).

The
input is terminated by n = 0.

[align=left]Output[/align]
Output the answer in a line.

[align=left]Sample Input[/align]

5
1 4 2 3 9
0

[align=left]Sample Output[/align]

136

Hint

In the sample, b1=1, c1=4, b2=4, c2=4, b3=4, c3=2, b4=3, c4=9, b5=9, c5=9, so b1 * c1 + b2 * c2 + … + b5 * c5 = 136.

[align=left]Author[/align]
SYSU

[align=left]Source[/align]
2014
Multi-University Training Contest 9

/**
给出一个数列:a[i],然后
b[i]:表示在 i 前面的项,如果有a[i]的倍数(要最靠近i的),那么b[i]就等于这个数,如果没有那么b[i] = a[i];
c[i]:表示在 i 后面的项,如果有a[i]的倍数(要最靠近i的),那么c[i] 就等于这个数,如果没有那么c[i] = a[i];
**/
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<vector>
using namespace std;

int a[100002],b[100002],c[100002];
vector<int>Q[100002];
int hash1[100002];
int main()
{
int n;
int MAX,MIN,k;
for(int i=2;i<=100000;i++)
for(int j=i;j<=100000;j=j+i)
Q[i].push_back(j);
while(scanf("%d",&n)>0)
{
if(n==0)break;
for(int i=1; i<=n; i++){
scanf("%d",&a[i]);
b[i] = c[i] = a[i];
}
memset(hash1,0,sizeof(hash1));
hash1[a[1]] = 1;
for(int i=2;i<=n;i++)
{
if(a[i]==1){
b[i] = a[i-1];
continue;
}
k = Q[a[i]].size();
MAX = -1;
for(int j=0;j<k;j++)
if(hash1[Q[a[i]][j]]!=0 && MAX<hash1[Q[a[i]][j]])
MAX = hash1[Q[a[i]][j]];

if(MAX == -1);
else b[i] = a[MAX];
hash1[a[i]] = i;
}
memset(hash1,0,sizeof(hash1));
hash1[a
] = n;
for(int i=n-1;i>=1;i--)
{
if(a[i]==1) { c[i] = a[i+1]; continue;}
MIN = 111111111;
k = Q[a[i]].size();
for(int j=0;j<k;j++)
if(hash1[Q[a[i]][j]]!=0 && MIN>hash1[Q[a[i]][j]])
MIN = hash1[Q[a[i]][j]];
if(MIN ==111111111 );
else c[i] = a[MIN];
hash1[a[i]] = i;
}
__int64 sum = 0;
for(int i=1;i<=n;i++)
sum = sum+((__int64)b[i])*c[i];
printf("%I64d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: