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; }
相关文章推荐
- hdu 4961 Boring Sum【构造题】
- 【瞎搞】HDU 4961 Boring Sum
- HDU 4961 Boring Sum 暴力
- hdu 4961 Boring Sum
- hdu 4961 Boring Sum
- HDU 4961 Boring Sum
- HDU 4961 Boring Sum 构造题
- HDU-4961 Boring Sum (模拟)
- HDU 4961 Boring Sum 因数分解
- hdu 4961 Boring Sum 多校九
- hdu 4961 Boring Sum
- hdu 4961 Boring Sum--2014 Multi-University Training Contest 9
- hdu 4961 Boring Sum 2014 Multi-University Training Contest 9
- HDU - 4961 Boring Sum
- hdu 4961 Boring Sum n*logn
- HDU 4961 Boring Sum
- hdu 4961 Boring Sum
- 【瞎搞】HDU 4961 Boring Sum
- 2014多校训练九(HDU 4960 HDU 4961 HDU 4965 HDU 4968 HDU 4969 HDU 4970)
- hdu 4961 Boring Sum(2014 Multi-University Training Contest 9)