【CodeForces - 510D】Fox And Jumping(dp,stlmap,数论的性质)

题干:

Fox Ciel is playing a game. In this game there is an infinite long tape with cells indexed by integers (positive, negative and zero). At the beginning she is standing at the cell 0.

There are also n cards, each card has 2 attributes: length li and cost ci. If she pays ci dollars then she can apply i-th card. After applying i-th card she becomes able to make jumps of length li, i. e. from cell x to cell (x - li) or cell (x + li).

She wants to be able to jump to any cell on the tape (possibly, visiting some intermediate cells). For achieving this goal, she wants to buy some cards, paying as little money as possible.

If this is possible, calculate the minimal cost.

Input

The first line contains an integer n (1 ≤ n ≤ 300), number of cards.

The second line contains n numbers li (1 ≤ li ≤ 109), the jump lengths of cards.

The third line contains n numbers ci (1 ≤ ci ≤ 105), the costs of cards.

Output

If it is impossible to buy some cards and become able to jump to any cell, output -1. Otherwise output the minimal cost of buying such set of cards.

Examples

Input

3
100 99 9900
1 1 1

Output

2

Input

5
10 20 30 40 50
1 1 1 1 1

Output

-1

Input

7
15015 10010 6006 4290 2730 2310 1
1 1 1 1 1 1 10

Output

6

Input

8
4264 4921 6321 6984 2316 8432 6120 1026
4264 4921 6321 6984 2316 8432 6120 1026

Output

7237

Note

In first sample test, buying one card is not enough: for example, if you buy a card with length 100, you can't jump to any cell whose index is not a multiple of 100. The best way is to buy first and second card, that will make you be able to jump to any cell.

In the second sample test, even if you buy all cards, you can't jump to any cell whose index is not a multiple of 10, so you should output -1.

题目大意:

  给出n张卡片,每张带有两个权值l[i]和c[i]。在一条无限长的纸带上,你可以选择花c[i]的钱来购买卡片i,从此以后可以向左或向右跳l[i]个单位。购买其他卡片后,可以获得更多的跳跃单位。先要求至少花多少元钱才能够任意跳到纸带上任意一个位置。若不行,输出-1。

解题报告:

    首先你要知道既然要可以跳到所有位置,充要条件是可以跳到1这个位置。换句话说,要想完成任务必须可以跳到1,而跳到1之后就可以跳到所有的位置,所以问题转化为挑选k张卡片来凑出 他们的 GCD 为1。

    然后我们用map进行滚动数组dp,,还有一个问题就是每次比较不用所有的都比较,只用管比较的两个数的gcd就行了,,因为只要gcd可以出来了,其他的都可以出来。(之前cf有一个凑等差数列的也是运用这个思想)

   至于时间复杂度问题,可以证明1e9范围内的每个数字,所具有的质因子个数<=9。所以在时间复杂度上是说的过去的。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
ll l[MAX];
ll c[MAX];
map mp;
map :: iterator it;
int main()
{
	int n;
	cin>>n;
	for(int i = 1; i<=n; i++) scanf("%lld",l+i);
	for(int i = 1; i<=n; i++) scanf("%lld",c+i);
	mp[0]=0;
	for(int i = 1; i<=n; i++) {
		//if(mp.find(l[i]) == mp.end()) mp[l[i]]=c[i];
		for(it = mp.begin(); it!= mp.end(); ++it) {
			ll g = __gcd(it->fi,l[i]);
			//printf("%lld\n",mp[1]);
			if(mp.find(g) == mp.end()) {
				mp[g] = it->se + c[i];
			}
			else {
				mp[g] = min(mp[g],it->se + c[i]);
				//printf("%lld\n",mp[1]);
			}
		}
	}
//	if(mp.size() > 500000) printf("hahahaha");
	if(mp.find(1) == mp.end()) puts("-1");
	else printf("%lld\n",mp[1]); 
	return 0 ;
 }

 

你可能感兴趣的:(动态规划(dp),Codeforce~)