唐纳德是一个数学天才。有一天,他的数学老师决定为难一下他。他跟唐纳德说:「现在我们来玩一个游戏。这个游戏总共 n轮,每一轮我都会给你一个数(第 i 轮给出的数是 ai)。你每次要回答一个数,是我给出的这个数的质因数,并且你说出的数不能重复。」
因为数学老师是刻意为难,所以这个游戏很有可能不可能进行到最后。但是聪明的数学老师早就已经知道这个游戏最多能进行几轮了。现在他把问题抛给了你,想看看你知不知道。
注意,1 不是质数。
Input
输入具有如下形式:
na1 a2 … an
第一行一个整数 n (1≤n≤3 000)。
第二行 n 个整数用空格隔开,a1,a2,…,an (2≤ai≤106)。
Output
输出游戏最多能进行几轮。
Examples
Input
3 7 6 3
Output
3
Input
5 2 2 2 2 2
Output
1
#include<bits/stdc++.h> using namespace std; vector <int> vic[100010]; int biao[100010]; // 标记在搜索这次增广路经中哪个点被用过 int x[100010]; int j[100021]; //记录二分图右边连的哪一个左边 int dfs(int dang){ for(int i=0;i<vic[dang].size();i++){ int now=vic[dang][i]; if(biao[now]==0){ biao[now]=1; if(j[now]==0||dfs(j[now])==1){ j[now]=dang; return 1; } } } return 0; } int main() { int m; scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d",&x[i]); } for(int i=0;i<x[i];i++){ for(int j=1;j<=sqrt(x[i]);j++){ if(x[i]%j==0){ vic[i].push_back(j); vic[i].push_back(x[i]%j); } } } memset(j,0,sizeof(j)); int ans=0; for(int i=0;i<m;i++){ memset(biao,0,sizeof(biao));//每次搜索增光路经要重新标记 ans+= dfs(i); } printf("%d\n",ans); return 0; }