BZOJ

洛谷


\(Solution\)

很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数。

那么就用两倍的。如果\(i\)可以向\(j'\)连边,\(j\)也向\(i'\)连边,如果上一次走了\(i->j'\),那么这一次一定走\(j->i'\)。

每次跑最大费用流,直至有一次费用变成负,然后加上当前正权值能抵消它的流量,最后总流量除以2就可以了。

\(Another Solution\)

两个数能匹配首先要能整除,其次它们所有质因子的次数和一定只相差1.

于是可以按这个次数的奇偶性建二分图,分别连源点汇点,一遍最大流就可以了。

ps:sb的我硬是把\(i\to j\)的费用设成\(0\),然后源点汇点连\(\log b[i]\)的边,然后再取幂。。最后写完发现不对,不会处理上面的问题。。贪心也调不对。

数字匹配\(O(sqrt(n))\)直接枚举就可以,闲的写什么MillerRabin+set。。

考试的时候一个题写了三百多行 还不算颓

时隔一年后的考试写出来了2333(虽然写过还是道水题)


第一种方法:

  1. //3212kb 112ms
  2. #include <set>
  3. #include <queue>
  4. #include <cmath>
  5. #include <cstdio>
  6. #include <cctype>
  7. #include <algorithm>
  8. #define gc() getchar()
  9. typedef long long LL;
  10. const int N=410,M=100005,INF=1e9;
  11. const int P[9]={2,3,5,7,13,17,31};
  12. int n,src,des,A[N],B[N],C[N],Enum,H[N],nxt[M],fr[M],to[M],cap[M],pre[N];
  13. bool inq[N];
  14. LL dis[N],cost[M];
  15. std::queue<int> q;
  16. std::set<int> is_p[2];
  17. inline int read()
  18. {
  19. int now=0,f=1;register char c=gc();
  20. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  21. for(;isdigit(c);now=now*10+c-'0',c=gc());
  22. return now*f;
  23. }
  24. inline void AddEdge(int u,int v,int w,LL c)
  25. {
  26. to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w, cost[Enum]=c;
  27. to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0, cost[Enum]=-c;
  28. }
  29. int FP(LL x,int k,int p)
  30. {
  31. LL t=1;
  32. for(; k; k>>=1,x=x*x%p)
  33. if(k&1) t=t*x%p;
  34. return (int)t;
  35. }
  36. bool Miller_Rabin(int x)
  37. {
  38. if(x==2) return 1;
  39. if(!(x&1)||x==1) return 0;
  40. for(int i=0; i<7; ++i)
  41. if(x==P[i]) return 1;
  42. else if(!(x%P[i])) return 0;
  43. int u=x-1,t=0;
  44. while(!(u&1)) u>>=1,++t;
  45. for(int i=0; i<7; ++i)
  46. {
  47. LL now=FP(P[i],u,x),las;
  48. for(int j=1; j<=t; ++j)
  49. {
  50. las=now, (now*=now)%=x;
  51. if(now==1&&las!=1&&las!=x-1) return 0;
  52. }
  53. if(now!=1) return 0;
  54. }
  55. return 1;
  56. }
  57. bool SPFA()
  58. {
  59. for(int i=1; i<=des; ++i) dis[i]=-1e12;
  60. dis[src]=0, q.push(src);
  61. while(!q.empty())
  62. {
  63. int x=q.front(); q.pop();
  64. inq[x]=0;
  65. for(int v,i=H[x]; i; i=nxt[i])
  66. if(cap[i]&&dis[to[i]]<dis[x]+cost[i])
  67. {
  68. dis[v=to[i]]=dis[x]+cost[i], pre[v]=i;
  69. if(!inq[v]) q.push(v),inq[v]=1;
  70. }
  71. }
  72. return dis[des]>-1e12;
  73. }
  74. LL Solve()
  75. {
  76. int flow=0,mn;
  77. LL sum_cost=0;
  78. while(SPFA())
  79. {//注意这只是一个二分图。。
  80. mn=1e9;
  81. for(int i=des; i!=src; i=fr[pre[i]]) mn=std::min(cap[pre[i]],mn);
  82. if(sum_cost+1ll*dis[des]*mn>=0){//dis[des]就是费用。
  83. for(int i=des; i!=src; i=fr[pre[i]]) cap[pre[i]]-=mn,cap[pre[i]^1]+=mn;
  84. sum_cost+=1ll*dis[des]*mn, flow+=mn;
  85. }
  86. else{
  87. flow+=(int)(sum_cost/std::abs(dis[des]));//加上剩余正价值能补多少负值。
  88. break;
  89. }
  90. }
  91. return flow>>1;
  92. }
  93. int main()
  94. {
  95. n=read(),Enum=1,src=0,des=n<<1|1;
  96. for(int i=1; i<=n; ++i) A[i]=read();
  97. for(int i=1; i<=n; ++i) B[i]=read();
  98. for(int i=1; i<=n; ++i) C[i]=read();
  99. for(int i=1; i<=n; ++i) AddEdge(src,i,B[i],0),AddEdge(i+n,des,B[i],0);
  100. for(int i=1; i<=n; ++i)
  101. for(int j=1; j<=n; ++j)
  102. if(A[i]>A[j]&&!(A[i]%A[j]))
  103. {
  104. int t=A[i]/A[j];
  105. if(is_p[0].count(t)) continue;
  106. if(is_p[1].count(t)) AddEdge(i,j+n,INF,1ll*C[i]*C[j]),AddEdge(j,i+n,INF,1ll*C[i]*C[j]);
  107. else{
  108. bool f=Miller_Rabin(t);
  109. if(f) is_p[1].insert(t),AddEdge(i,j+n,INF,1ll*C[i]*C[j]),AddEdge(j,i+n,INF,1ll*C[i]*C[j]);
  110. else is_p[0].insert(t);
  111. }
  112. }
  113. printf("%lld",Solve());
  114. return 0;
  115. }

第二种方法(19.2.17):

  1. /*
  2. 2840kb 28ms
  3. 常规做建二分图跑费用流很容易,但因为拆了点每对数之间可能选两次。但是既然选了一次那就一定会选第二次。最后费用即将变成负数时判一下还能选多少个,然后流量除以二即可。
  4. 因为匹配条件是$i$可整除$j$且结果是质数,那么$i,j$之间质因子次数一定相差一,可以直接判,同时根据质因子次数奇偶性可以分别连源点汇点,就没有之前的问题了。
  5. 另外这张二分图里费用就是$dis[T]$。
  6. */
  7. #include <queue>
  8. #include <cstdio>
  9. #include <cctype>
  10. #include <algorithm>
  11. #define gc() getchar()
  12. typedef long long LL;
  13. const int N=205,M=(N*N+N)*2,INF=1<<30;
  14. const LL INFll=1ll<<60;
  15. int T,Enum,H[N],nxt[M],fr[M],to[M],cap[M],pre[N];
  16. LL dis[N],cost[M];
  17. inline int read()
  18. {
  19. int now=0,f=1;register char c=gc();
  20. for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
  21. for(;isdigit(c);now=now*10+c-48,c=gc());
  22. return now*f;
  23. }
  24. inline void AE(int u,int v,int w,LL c)
  25. {
  26. to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w, cost[Enum]=c;
  27. to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0, cost[Enum]=-c;
  28. }
  29. int Calc(int x)
  30. {
  31. int t=0;
  32. for(int i=2; 1ll*i*i<=x; ++i)
  33. if(!(x%i))
  34. {
  35. x/=i, ++t;
  36. while(!(x%i)) x/=i, ++t;
  37. }
  38. if(x!=1) ++t;
  39. return t;
  40. }
  41. bool SPFA()
  42. {
  43. static bool inq[N];
  44. static std::queue<int> q;
  45. for(int i=1; i<=T; ++i) dis[i]=-INFll;
  46. q.push(0), dis[0]=0;
  47. while(!q.empty())
  48. {
  49. int x=q.front(); q.pop();
  50. inq[x]=0;
  51. for(int i=H[x],v; i; i=nxt[i])
  52. if(dis[v=to[i]]<dis[x]+cost[i] && cap[i])
  53. pre[v]=i, dis[v]=dis[x]+cost[i], !inq[v]&&(q.push(v),inq[v]=1);
  54. }
  55. return dis[T]>-INFll;
  56. }
  57. int Solve()
  58. {
  59. int res=0; LL now=0;
  60. while(SPFA())
  61. {
  62. int mn=INF;
  63. for(int i=T; i; i=fr[pre[i]]) mn=std::min(mn,cap[pre[i]]);
  64. if(now+dis[T]*mn>=0)
  65. {
  66. now+=dis[T]*mn, res+=mn;
  67. for(int i=T; i; i=fr[pre[i]]) cap[pre[i]]-=mn, cap[pre[i]^1]+=mn;
  68. }
  69. else
  70. {
  71. res+=now/std::abs(dis[T]);//abs!!
  72. break;
  73. }
  74. }
  75. return res;
  76. }
  77. int main()
  78. {
  79. static int A[N],B[N],C[N],tm[N];
  80. freopen("pair.in","r",stdin);
  81. freopen("pair.out","w",stdout);
  82. int n=read(); Enum=1, T=n+1;
  83. for(int i=1; i<=n; ++i) tm[i]=Calc(A[i]=read());
  84. for(int i=1; i<=n; ++i) B[i]=read();
  85. for(int i=1; i<=n; ++i) C[i]=read();
  86. for(int i=1; i<=n; ++i)
  87. {
  88. if(tm[i]&1)
  89. {
  90. AE(0,i,B[i],0);
  91. for(int j=1; j<=n; ++j)
  92. if(!(tm[j]&1) && tm[i]-tm[j]==1 && !(A[i]%A[j])) AE(i,j,INF,1ll*C[i]*C[j]);
  93. }
  94. else
  95. {
  96. AE(i,T,B[i],0);
  97. for(int j=1; j<=n; ++j)
  98. if(tm[j]&1 && tm[i]-tm[j]==1 && !(A[i]%A[j])) AE(j,i,INF,1ll*C[i]*C[j]);
  99. }
  100. }
  101. printf("%d\n",Solve());
  102. return 0;
  103. }

弃疗的暴力+最大流(18.4.1):

  1. #include <set>
  2. #include <queue>
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. typedef long long LL;
  8. const int N=410,M=100005,INF=1e9;
  9. const int P[9]={2,3,5,7,13,17,31};
  10. int n,range,src,des,A[N],B[N],C[N],Enum,cur[N],H[N],nxt[M],fr[M],to[M],cap[M],pre[N],lev[N],num[N],que[N];
  11. std::queue<int> q;
  12. std::set<int> is_p[2];
  13. inline int read()
  14. {
  15. int now=0,f=1;register char c=gc();
  16. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  17. for(;isdigit(c);now=now*10+c-'0',c=gc());
  18. return now*f;
  19. }
  20. inline void AddEdge(int u,int v,int w)
  21. {
  22. printf("%d->%d %d\n",u,v,w);
  23. to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w;
  24. to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0;
  25. }
  26. int FP(LL x,int k,int p)
  27. {
  28. LL t=1;
  29. for(; k; k>>=1,x=x*x%p)
  30. if(k&1) t=t*x%p;
  31. return (int)t;
  32. }
  33. bool Miller_Rabin(int x)
  34. {
  35. if(x==2) return 1;
  36. if(!(x&1)||x==1) return 0;
  37. for(int i=0; i<7; ++i)
  38. if(x==P[i]) return 1;
  39. else if(!(x%P[i])) return 0;
  40. int u=x-1,t=0;
  41. while(!(u&1)) u>>=1,++t;
  42. for(int i=0; i<7; ++i)
  43. {
  44. LL now=FP(P[i],u,x),las;
  45. for(int j=1; j<=t; ++j)
  46. {
  47. las=now, (now*=now)%=x;
  48. if(now==1&&las!=1&&las!=x-1) return 0;
  49. }
  50. if(now!=1) return 0;
  51. }
  52. return 1;
  53. }
  54. namespace Subtask1
  55. {
  56. int Ans;
  57. bool can[13][13],vis[13];
  58. void DFS(int x,int tm,LL sum)
  59. {//O(n!)
  60. if(x>n)
  61. if(sum>=0 && tm>Ans) Ans=tm;
  62. else ;
  63. else{
  64. if(vis[x]) DFS(x+1,tm,sum);
  65. else{
  66. vis[x]=1;
  67. for(int i=1; i<=n; ++i)
  68. if(can[x][i]&&!vis[i])
  69. vis[i]=1, DFS(x+1,tm+1,sum+1ll*C[x]*C[i]), vis[i]=0;
  70. vis[x]=0;
  71. DFS(x+1,tm,sum);
  72. }
  73. }
  74. }
  75. void Solve()
  76. {
  77. for(int i=1; i<=n; ++i) A[i]=read();
  78. for(int i=1; i<=n; ++i) B[i]=read();
  79. for(int i=1; i<=n; ++i) C[i]=read();
  80. for(int i=1; i<=n; ++i)
  81. for(int j=1; j<=n; ++j)
  82. if(!(A[i]%A[j])&&i!=j)
  83. {
  84. int t=A[i]/A[j];
  85. if(is_p[0].count(t)) continue;
  86. if(is_p[1].count(t)) can[i][j]=1;
  87. else{
  88. bool f=Miller_Rabin(t);
  89. if(f) is_p[1].insert(t),can[i][j]=1;
  90. else is_p[0].insert(t);
  91. }
  92. }
  93. DFS(1,0,0);
  94. printf("%d",Ans);
  95. }
  96. }
  97. bool BFS()
  98. {
  99. for(int i=src; i<des; ++i) lev[i]=des+1;
  100. lev[des]=0, que[0]=des; int h=0,t=1;
  101. while(h<t)
  102. {
  103. int x=que[h++];
  104. for(int i=H[x]; i; i=nxt[i])
  105. if(lev[to[i]]==des+1 && cap[i^1])
  106. lev[to[i]]=lev[x]+1, que[t++]=to[i];
  107. }
  108. return lev[src]<=des;
  109. }
  110. void Augment(){
  111. for(int i=des; i!=src; i=fr[pre[i]])
  112. --cap[pre[i]], ++cap[pre[i]^1];
  113. }
  114. int ISAP()
  115. {
  116. if(!BFS()) return 0;
  117. for(int i=src; i<=des; ++i) ++num[lev[i]],cur[i]=H[i];
  118. int x=src,res=0; bool f=0;
  119. while(lev[src]<=des)
  120. {
  121. if(x==des) x=src,f=0,++res,Augment();
  122. bool can=0;
  123. for(int i=cur[x]; i; i=nxt[i])
  124. if((to[i]==des&&f)||(to[i]!=des && cap[i]))
  125. {
  126. printf("%d->%d lev:%d f:%d ",x,to[i],lev[x],f);
  127. if(x>n&&to[i]<=n) f=1;
  128. can=1, cur[x]=i, pre[x=to[i]]=i;
  129. printf("now:%d\n",f);
  130. break;
  131. }
  132. if(!can)
  133. {
  134. int mn=des;
  135. for(int i=H[x]; i; i=nxt[i])
  136. if((to[i]==des&&f)||(to[i]!=des&&cap[i])) mn=std::min(mn,lev[to[i]]);
  137. if(!--num[lev[x]]) break;
  138. printf("Change:%d %d->",x,lev[x]);
  139. ++num[lev[x]=mn+1];
  140. printf("%d\n",lev[x]);
  141. cur[x]=H[x];
  142. if(x!=src)
  143. {
  144. if(x<=n&&fr[pre[x]]>n) f=0;
  145. x=fr[pre[x]];
  146. }
  147. }
  148. }
  149. return res;
  150. }
  151. int main()
  152. {
  153. freopen("pair.in","r",stdin);
  154. freopen("pair.out","w",stdout);
  155. n=read();
  156. if(n<=10) {Subtask1::Solve(); return 0;}
  157. Enum=1,src=0,des=n<<1|1;
  158. for(int i=1; i<=n; ++i) A[i]=read();
  159. for(int i=1; i<=n; ++i) B[i]=read();
  160. for(int i=1; i<=n; ++i) C[i]=read();
  161. for(int i=1; i<=n; ++i) AddEdge(src,i,INF),AddEdge(i+n,des,INF),AddEdge(i,i+n,B[i]);
  162. for(int i=1; i<=n; ++i)
  163. for(int j=1; j<=n; ++j)
  164. if(!(A[i]%A[j])&&i!=j)
  165. {
  166. int t=A[i]/A[j];
  167. if(is_p[0].count(t)) continue;
  168. if(is_p[1].count(t)) AddEdge(i+n,j,INF);
  169. else{
  170. bool f=Miller_Rabin(t);
  171. if(f) is_p[1].insert(t),AddEdge(i+n,j,INF);
  172. else is_p[0].insert(t);
  173. }
  174. }
  175. printf("%d",ISAP());
  176. return 0;
  177. }

丧心病狂的费用流(其实就是sb了)(18.4.1)

  1. #include <set>
  2. #include <queue>
  3. #include <cmath>
  4. #include <cstdio>
  5. #include <cctype>
  6. #include <algorithm>
  7. #define gc() getchar()
  8. typedef long long LL;
  9. const int N=410,M=100005,INF=1e9;
  10. const int P[9]={2,3,5,7,13,17,31};
  11. int n,range,src,des,A[N],B[N],C[N],Enum,H[N],nxt[M],fr[M],to[M],cap[M],Cap[M],pre[N];
  12. double dis[N],cost[M],neg[M];
  13. bool inq[N],ignore[M];
  14. std::queue<int> q;
  15. std::set<int> is_p[2];
  16. inline int read()
  17. {
  18. int now=0,f=1;register char c=gc();
  19. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  20. for(;isdigit(c);now=now*10+c-'0',c=gc());
  21. return now*f;
  22. }
  23. inline void AddEdge(int u,int v,int w,int c)
  24. {
  25. if(!c){
  26. to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, Cap[Enum]=cap[Enum]=w, cost[Enum]=0, ignore[Enum]=1;
  27. to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, Cap[Enum]=cap[Enum]=0, cost[Enum]=0, ignore[Enum]=1;
  28. }
  29. else if(c<0){
  30. to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, Cap[Enum]=cap[Enum]=w, cost[Enum]=-log2((double)(-c)), neg[Enum]=1;
  31. to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, Cap[Enum]=cap[Enum]=0, cost[Enum]=log2((double)(-c)), neg[Enum]=1;
  32. }
  33. else{
  34. to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, Cap[Enum]=cap[Enum]=w, cost[Enum]=log2((double)c);
  35. to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, Cap[Enum]=cap[Enum]=0, cost[Enum]=-log2((double)c);
  36. }
  37. printf("%d->%d %d %d %.3lf\n",u,v,w,c,cost[Enum-1]);
  38. }
  39. int FP(LL x,int k,int p)
  40. {
  41. LL t=1;
  42. for(; k; k>>=1,x=x*x%p)
  43. if(k&1) t=t*x%p;
  44. return (int)t;
  45. }
  46. bool Miller_Rabin(int x)
  47. {
  48. if(x==2) return 1;
  49. if(!(x&1)||x==1) return 0;
  50. for(int i=0; i<7; ++i)
  51. if(x==P[i]) return 1;
  52. else if(!(x%P[i])) return 0;
  53. int u=x-1,t=0;
  54. while(!(u&1)) u>>=1,++t;
  55. for(int i=0; i<7; ++i)
  56. {
  57. LL now=FP(P[i],u,x),las;
  58. for(int j=1; j<=t; ++j)
  59. {
  60. las=now, (now*=now)%=x;
  61. if(now==1&&las!=1&&las!=x-1) return 0;
  62. }
  63. if(now!=1) return 0;
  64. }
  65. return 1;
  66. }
  67. bool SPFA()
  68. {
  69. for(int i=1; i<=des; ++i) dis[i]=1e14;
  70. dis[src]=0, q.push(src);
  71. while(!q.empty())
  72. {
  73. int x=q.front(); q.pop();
  74. inq[x]=0;
  75. for(int v,i=H[x]; i; i=nxt[i])
  76. if(cap[i]&&(neg[i]||dis[to[i]]>dis[x]+cost[i]))
  77. {
  78. dis[v=to[i]]=dis[x]+cost[i], pre[v]=i;
  79. if(!inq[v]) q.push(v);
  80. }
  81. }
  82. return dis[des]<1e14;
  83. }
  84. bool debug=1;
  85. double MCMF(LL &flow)
  86. {
  87. int mn=1e9; double res=0,tmp1=0;
  88. bool f=0;
  89. for(int i=des; i!=src; i=fr[pre[i]])
  90. {
  91. mn=std::min(cap[pre[i]],mn);
  92. if(ignore[i]&&i<=range) f=1;
  93. }
  94. // printf("flow:%I64d ",flow);
  95. if(mn>=flow) mn=flow,flow=0;
  96. else flow-=mn;
  97. if(f){
  98. for(int i=des; i!=src; i=fr[pre[i]])
  99. {
  100. if(debug) printf("%d<-",i),
  101. cap[pre[i]]-=mn, cap[pre[i]^1]+=mn;
  102. if(neg[i]) ;
  103. }
  104. if(debug) printf("%d\n",src);
  105. if(debug) printf("then:%I64d %d\n",flow,mn);
  106. return 0;
  107. }
  108. for(int i=des; i!=src; i=fr[pre[i]])
  109. {
  110. if(debug) printf("%d<-",i),
  111. cap[pre[i]]-=mn, cap[pre[i]^1]+=mn, res+=cost[pre[i]];
  112. if(neg[pre[i]]&&!cost[pre[i]]) tmp1+=1.0;
  113. }
  114. if(debug) printf("%d\n",src);
  115. if(debug) printf("then:%I64d res:%.3lf 2:%.3lf\n",flow,res,res<0 ? -1.0*mn*pow(2.0,-res) : 1.0*mn*pow(2.0,res));
  116. return res<0 ? -1.0*mn*pow(2.0,-res)-tmp1 : 1.0*mn*pow(2.0,res)-tmp1;
  117. }
  118. bool Check(LL flow)
  119. {
  120. double sigma=0;
  121. LL tmp=flow;
  122. for(int i=2; i<=Enum; ++i) cap[i]=Cap[i];
  123. while(SPFA())
  124. {
  125. sigma+=MCMF(flow);
  126. if(!flow||sigma>0) break;
  127. }
  128. if(debug) printf("End:flow:%I64d bef:%I64d sigma:%.3lf\n\n",flow,tmp,sigma);
  129. return !flow&&sigma<=0;
  130. }
  131. int main()
  132. {
  133. freopen("pair.in","r",stdin);
  134. // freopen("pair.out","w",stdout);
  135. n=read(),Enum=1,src=0,des=n<<1|1;
  136. for(int i=1; i<=n; ++i) A[i]=read();
  137. for(int i=1; i<=n; ++i) B[i]=read();
  138. for(int i=1; i<=n; ++i) C[i]=read();
  139. for(int i=1; i<=n; ++i) AddEdge(src,i,INF,0),AddEdge(i+n,des,INF,0),AddEdge(i,i+n,B[i],-C[i]);
  140. // range=Enum;
  141. for(int i=1; i<=n; ++i)
  142. for(int j=1; j<=n; ++j)
  143. if(!(A[i]%A[j])&&i!=j)
  144. {
  145. int t=A[i]/A[j];
  146. if(is_p[0].count(t)) continue;
  147. if(is_p[1].count(t)) AddEdge(i+n,j,INF,0);
  148. else{
  149. bool f=Miller_Rabin(t);
  150. if(f) is_p[1].insert(t),AddEdge(i+n,j,INF,0);
  151. else is_p[0].insert(t);
  152. }
  153. }
  154. // long long l=0,r=1e10,mid,ans=0;
  155. long long l=1,r=15,mid,ans=0;
  156. while(l<=r)
  157. if(Check(mid=l+r>>1)) ans=mid,l=mid+1;
  158. else r=mid-1;
  159. printf("%I64d",ans);
  160. return 0;
  161. }

BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)的更多相关文章

  1. BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]

    4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...

  2. 4514: [Sdoi2016]数字配对 费用流

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4514 思路 EK直接贪心做 <0的时候加上剩余返回 二分图a->b的时候 把b- ...

  3. 图论(费用流):BZOJ 4514 [Sdoi2016]数字配对

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 820  Solved: 345[Submit][Status ...

  4. BZOJ 4514: [Sdoi2016]数字配对

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1606  Solved: 608[Submit][Statu ...

  5. 【BZOJ4514】[Sdoi2016]数字配对 费用流

    [BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...

  6. bzoj4514: [Sdoi2016]数字配对--费用流

    看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...

  7. 【BZOJ 4514】[Sdoi2016]数字配对 费用流

    利用spfa流的性质,我直接拆两半,正解分奇偶(妙),而且判断是否整除且质数我用的是暴力根号,整洁判断质数个数差一(其他非spfa流怎么做?) #include <cstdio> #inc ...

  8. 【BZOJ4514】【SDOI2016】数字配对 [费用流]

    数字配对 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...

  9. [bzoj4514]数字配对[费用流]

    今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦... 果然考试的时候还是打不了高端算法,调了...几天 默默地yy了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...

随机推荐

  1. Here’s just a fraction of what you can do with linear algebra

    Here’s just a fraction of what you can do with linear algebra The next time someone wonders what the ...

  2. javascript命名空间

    命名空间:命名空间有助于减少程序中所需要的全局变量的数量,并且同时还有助于避免命名冲突或过长的名字前缀. 板栗: var MYAPP = MYAPP || {}; MYAPP.namespace = ...

  3. [百度地图] 用于类似 DWZ UI 框架的 百度地图 功能封装类 [MultiZMap.js] 实例源码

    MultiZMap 功能说明 MultiZMap.js 本类方法功能大多使用 prototype 原型 实现,它是 ZMap 的多加载版本,主要用于类似 DWZ 这个 多标签的 UI 的框架: 包含的 ...

  4. es6笔记(4) Set数据结构

    概要 介绍: 集合是由一组无序且唯一的项组成的,这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中. ES6提供了数据结构Set.它类似于数组,但是没有重复的值. 特点: key与v ...

  5. C# 解决VS2008在win7找不到输入序列号的地方

    1.VS2008在Windows7 打开维护界面看不到可以输序列号的地方. 因为微软把他隐藏了. 2.我们可以借用工具把他显示出来 下载地址:http://www.zlsoft.com/techbbs ...

  6. python实现两个经纬度点之间的距离和方位角

    from:http://blog.csdn.net/zhuqiuhui/article/details/53180395 1.  求两个经纬点的方位角,P0(latA, lonA), P1(latB, ...

  7. MySQL多源复制【转】

    什么是多源复制? 首先,我们需要清楚 multi-master 与multi-source 复制不是一样的. Multi-Master 复制通常是环形复制, 你可以在任意主机上将数据复制给其他主机. ...

  8. how-to-pass-a-class-variable-to-a-decorator-inside-class-definition

    https://stackoverflow.com/questions/17522706/how-to-pass-a-class-variable-to-a-decorator-inside-clas ...

  9. Java工具库:

    1.  重试框架: https://docs.spring.io/spring-batch/trunk/reference/html/retry.html <dependency> < ...

  10. 重温CSS之文档结构

    我们来看看几个基本的HTML页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...