程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU - 4961 Boring Sum

HDU - 4961 Boring Sum

編輯:C++入門知識

HDU - 4961 Boring Sum


Problem Description 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<=jj 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|ij 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.
Input 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.
Output Output the answer in a line.
Sample Input
5
1 4 2 3 9
0

Sample Output
136
題意:給你一個數組,讓你生成兩個新的數組,A要求每個數如果能在它的前面找個最近的一個是它倍數的數,那就變成那個數,否則是自己,C是往後找,輸出交叉相乘的和
思路:掃描記錄因子處理
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef __int64 ll; 
const int MAXN = 100005;

int a[MAXN], b[MAXN], c[MAXN], vis[MAXN];
int n;

int main() {
	while (scanf("%d", &n) == 1) {
		if (n == 0)
			break;
		for (int i = 1; i <= n; i++) 
			scanf("%d", &a[i]); 

		memset(vis, 0, sizeof(vis));
		for (int i = 1; i <= n; i++) {
			if (vis[a[i]])
				b[i] = a[vis[a[i]]];
			else
				b[i] = a[i];
			for (int j = 1; j <= (int)sqrt((double)a[i]+0.5); j++) {
				if (a[i] % j == 0) {
					vis[j] = i;
					vis[a[i] / j] = i;
				}
			}
		}

		memset(vis, 0, sizeof(vis));
		for (int i = n; i >= 1; i--) {
			if (vis[a[i]])
				c[i] = a[vis[a[i]]];
			else
				c[i] = a[i];
			for (int j = 1; j <= (int)sqrt((double)a[i]+0.5); j++) {
				if (a[i] % j == 0) {
					vis[j] = i;
					vis[a[i] / j] = i;
				}
			}
		}

		ll sum = 0;
		for (int i = 1; i <= n; i++) {
			sum += (ll)b[i] * c[i]; 
		}
		printf("%I64d\n", sum); 
	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved