hdu 4961

原題鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4961

ac代碼:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>

using namespace std;

struct Node 
{
	long long  x;
	long long l, r;
};

const int M = 100000 + 10;
Node inter[M];
int hash[M];
map<int, int> m;

int main()
{
	int n;
	long long x;
	while(~scanf("%d",&n),n)
	{
		for(int i = 1; i <= n; i ++)
		{
			scanf("%I64d", &x);
			inter[i].x = inter[i].l = inter[i].r = x;
		}
		memset(hash, 0, sizeof(hash));
		m.clear();
		hash[inter[1].x] ++;
		m[inter[1].x] = 1;
		for(int i = 2; i <= n; i ++)
		{
			x = inter[i].x;
			for(int k = 1; k * k <= x; k ++)
			{
			 	if(x % k == 0)
			 	{
			 		int j = x / k;
			 		if(hash[k])
			 		{
			 			inter[m[k]].r = x;
			 			hash[k] --;
			 			m.erase(k);
			 		}
			 		if(hash[j])
			 		{
			 			inter[m[j]].r = x;
			 			hash[j] --;
			 			m.erase(j);
			 		}
			 	}
			}
			
			hash[x] ++;
			m[x] = i;
		}
		memset(hash, 0, sizeof(hash));
		m.clear();
		hash[inter[n].x] ++;
		m[inter[n].x] = n;
		for(int i = n - 1; i >= 1; i--)
		{	
			x = inter[i].x;
			for(int j = 1; j * j <= x; j ++)
			{
				if(x % j == 0)
				{
					int k = x / j;
					if(hash[j])
					{
						hash[j] --;
						inter[m[j]].l = x;
						m.erase(j);
					}
					if(hash[k])
					{
						hash[k] --;
						inter[m[k]].l = x;
						m.erase(k);
					}
				}
			}
			
			hash[inter[i].x] ++;
			m[inter[i].x] = i;
		}
		long long ans = 0;
		for(int i = 1; i <= n; i ++)
		{
			ans += inter[i].l * inter[i]. r;
		}
		printf("%I64d\n",ans);
		// for(int i = 1; i <= n; i ++)
		// 	printf("%d %d %d\n", inter[i].l, inter[i].x, inter[i].r);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章