QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1135#699425#9545. Magical Sethos_lyricucup-team3555Failed.2024-11-05 20:42:172024-11-05 20:42:17

詳細信息

Extra Test:

Accepted
time: 333ms
memory: 33100kb

input:

300
921080160 964323360 879278400 882882000 754593840 949188240 797837040 836035200 871350480 714954240 673152480 868467600 815134320 896575680 998197200 834593760 697656960 67108864 819458640 740900160 772611840 833152320 962161200 707747040 931890960 886485600 797116320 830269440 701981280 8021613...

output:

3277

result:

ok single line: '3277'

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#699425#9545. Magical Setucup-team3555#AC ✓38ms16576kbC++202.2kb2024-11-02 08:55:582024-11-05 20:19:42

answer

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define ll long long 

const int N=1e6+5,M=31623;
const ll inf=1e9;
int n,m,idx=0,prm[N],cnt=0,ct[N];
bool vis[N];
gp_hash_table<int,int> mp;

namespace MCMF{
  int S,T,head[N],tot=1,cur[N];
  ll dis[N];
  bool vis[N];
  struct Edge{
  	int v,nxt;
  	ll w,c;
  }e[N<<1];
  
  void add(int u,int v,int w,int c){
  	e[++tot]={v,head[u],w,-c};head[u]=tot;
  	e[++tot]={u,head[v],0,c},head[v]=tot;
  }
  
  bool spfa(){
  	for(int i=S;i<=T;i++) dis[i]=inf,cur[i]=head[i],vis[i]=false;
  	queue<int> Q;
  	dis[S]=0,Q.push(S),vis[S]=1;
  	while(!Q.empty()){
  	  int u=Q.front();Q.pop();
	  vis[u]=0;
	  for(int i=head[u];i;i=e[i].nxt){
	  	int v=e[i].v;ll w=e[i].w,c=e[i].c;
	  	if(w&&dis[v]>dis[u]+c){
	  	  dis[v]=dis[u]+c;
		  if(!vis[v]) Q.push(v),vis[v]=1;	
		}
	  }	
	}
	return dis[T]!=inf;
  }
  
  ll dfs(int u,ll flow){
  	if(u==T||!flow) return flow;
  	ll res=flow;
  	vis[u]=1;
	for(int i=cur[u];i&&res;i=e[i].nxt){
  	  cur[u]=i;
  	  int v=e[i].v;ll w=e[i].w,c=e[i].c;
  	  if(!vis[v]&&w&&dis[v]==dis[u]+c){
  	    ll f=dfs(v,min(w,res));
		res-=f,e[i].w-=f,e[i^1].w+=f;	
	  }
	}
	return flow-res;
  }
  
  ll dinic(){
  	ll res=0,ans=0;
  	while(spfa()){
  	  ll flow=dfs(S,inf);
	  res+=flow,ans+=flow*dis[T];	
	}
	return ans;
  }
}

void init(){
  for(int i=2;i<=M;i++){
    if(!vis[i]) prm[++cnt]=i;
    for(int j=1;j<=cnt&&i*prm[j]<=M;j++){
      vis[i*prm[j]]=1;
      if(i%prm[j]==0) break;
    }
  }
}

int Count(int x){
  int res=0;
  for(int i=1;i<=cnt&&prm[i]<=x;i++) while(x%prm[i]==0) x/=prm[i],++res;
  if(x>1) ++res;
  return res;
}

void wrk(int i,int j,int nw){
  if(mp.find(j)==mp.end()) mp[j]=++idx,ct[idx]=Count(j);
  MCMF::add(i,mp[j],1,nw-ct[mp[j]]);
}

int main(){
  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  cin>>n;MCMF::S=0,idx=n;init();
  for(int i=1,x;i<=n;i++){
    cin>>x,MCMF::add(MCMF::S,i,1,0);
    int nw=Count(x);
    for(int j=1;j*j<=x;j++) if(x%j==0){
      wrk(i,j,nw);
      if(j*j!=x) wrk(i,x/j,nw);
    }
  }
  MCMF::T=++idx;
  for(int i=n+1;i<idx;i++) MCMF::add(i,idx,1,0);
  cout<<-MCMF::dinic();
  return 0;
}