题目描述 Description

有一天萌萌哒Sevenkplus在跟素数们玩>_<。。。他玩着玩着突然想到一个问题!就是这样的:
    从1到n这n个自然数中,选出一些数使得它们之间两两互质并且它们的和最大。
    当然Sevenkplus几分钟就秒杀了>_<。。。你也来试试吧~~~
    比如说n=10,那么选择{1,5,7,8,9}就行了,答案是30。

输入描述 Input Description

一行一个整数n

输出描述 Output Description

一行一个整数表示答案

样例输入 Sample Input

3

样例输出 Sample Output

6

数据范围及提示 Data Size & Hint

【数据范围】

测试点
    1..2:n<=100
    3..5:n<=1000
    6..10:n<=200000

【卖萌向】

素数可是很可爱的哦^_^

【来源】

我们都爱GYZ摸你赛 Problem C Hard

好题

一开始眼瞎+脑残,以为肯定是每一个素数都单独选它的最大次幂,全WA

好吧,看题解,果真是网络流+数论

先筛素数,把素数分成两类,一类是小于等于根号n的,这些可以自己乘多次,大于根号n的只能有一次幂

我们考虑这两类凑成一对一对的,如果凑成一对会更优,就连一条权值为增益的边(不过为什么不能小素数凑对呢?)

然后做二分图最大匹配

代码就别看了,因为建图,我的变量名已经乱了

 var
flag:array[..]of boolean;
zhi,best:array[..]of longint;
first,next,last,val,cost,vis,db,link:array[..]of longint;
n,tot,jie,num,time:longint;
ans:int64; procedure shai;
var
i,j:longint;
begin
for i:= to n do
begin
if flag[i]=false then
begin
inc(tot);
zhi[tot]:=i;
end;
for j:= to tot do
begin
if i*zhi[j]<=n then flag[i*zhi[j]]:=true
else break;
if i mod zhi[j]= then break;
end;
end;
end; procedure insert(x,y,z:longint);
begin
inc(num);
last[num]:=y;
next[num]:=first[x];
first[x]:=num;
val[num]:=z;
if db[x]<z then db[x]:=z;
end; procedure init;
var
i,j,k,s:longint;
begin
read(n);
shai;
ans:=;
for i:= to tot do
begin
k:=zhi[i];
while k*zhi[i]<=n do
k:=k*zhi[i];
if k>zhi[i] then jie:=i;
best[i]:=k;
ans:=ans+k;
end;
for i:= to jie do
for j:=jie+ to tot do
begin
s:=zhi[j];
while s*zhi[i]<=n do
s:=s*zhi[i];
if s>best[i]+best[j] then insert(i,j,s-best[i]-best[j]);
end;
for i:= to jie do
insert(i,tot+i,);
end; function find(x:longint):boolean;
var
i:longint;
begin
vis[x]:=time;
i:=first[x];
while i<> do
begin
if (vis[last[i]]<>time)and(val[i]=db[x]+db[last[i]]) then
begin
vis[last[i]]:=time;
if (link[last[i]]=)or(find(link[last[i]])) then
begin
link[last[i]]:=x;
cost[last[i]]:=val[i];
exit(true);
end;
end;
i:=next[i];
end;
exit(false);
end; function km:int64;
var
i,j,k,d:longint;
begin
for i:= to jie do
begin
while true do
begin
inc(time);
if find(i) then break;
d:=maxlongint;
for k:= to jie do
if vis[k]=time then
begin
j:=first[k];
while j<> do
begin
if vis[last[j]]<>time then
if d>db[k]+db[last[j]]-val[j] then d:=db[k]+db[last[j]]-val[j];
j:=next[j];
end;
end;
if d=maxlongint then break;
for j:= to jie do
if vis[j]=time then dec(db[j],d);
for j:=jie+ to tot do
if vis[j]=time then inc(db[j],d);
end;
end;
km:=;
for i:=jie+ to tot do
inc(km,cost[i]);
end; begin
init;
write(km+ans);
end.

1874 素数和最大 - Wikioi的更多相关文章

  1. wikioi 1430 素数判定

    /*====================================================================== 题目描述 Description 质数又称素数.指在一 ...

  2. wikioi 1434 孪生素数 水题、素数模版

    1434 孪生素数 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 输出100以内的所有相差6的孪生素数:如, 5 11 7 13 ...

  3. Help Hanzo (素数筛+区间枚举)

    Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000).     (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼 ...

  4. Java 素数 prime numbers-LeetCode 204

    Description: Count the number of prime numbers less than a non-negative number, n click to show more ...

  5. 求解第N个素数

    任务 求解第 10,0000.100,0000.1000,0000 ... 个素数(要求精确解). 想法 Sieve of Eratosthenes 学习初等数论的时候曾经学过埃拉托斯特尼筛法(Sie ...

  6. 使用BitArray判断素数

    首先显示1024范围内的所有素数,然后显示输入的数是否是素数.1024 是代码中计算的素数的范围,可以修改.计算平方根,是为了确定一个基数的范围.1024的平方根是32,两个超过32 的数相乘,肯定大 ...

  7. 查找素数Eratosthenes筛法的mpi程序

    思路: 只保留奇数 (1)由输入的整数n确定存储奇数(不包括1)的数组大小: n=(n%2==0)?(n/2-1):((n-1)/2);//n为存储奇数的数组大小,不包括基数1 (2)由数组大小n.进 ...

  8. Openjudge 1.13-23:区间内的真素数(每日一水)

    总时间限制:  1000ms 内存限制:  65536kB 描述 找出正整数 M 和 N 之间(N 不小于 M)的所有真素数.真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为 ...

  9. java语言 打印素数实例

    //根据定义判断素数---循环n-1次,当n很大时循环n次 public static void main(String[] args) {        // TODO Auto-generated ...

随机推荐

  1. Sublime Text3 包管理器、插件安装

    安装插件之前先要安装包管理器,包管理器的安装也很简单,复制粘贴对应版本命令代码回车即可 一.包管理器安装 1.打开Sublime3控制台,按ctrl+~ 2.输入安装包管理器命令行代码 3.注意需要联 ...

  2. 极其简单的使用基于gulp和sass前端工作流

    简单的记录自己如何在实际工作中使用gulp和sass的.我的原则是,小而美! gulp与sass介绍 gulp 什么是gulp?和Grunt一样,是一种任务管理工具:和Grunt又不一样,gulp是一 ...

  3. Vi三种模式详解

    命令行模式 (command mode/一般模式) 任何时候,不管用户处于何种模式,只要按一下“ESC”键,即可使Vi进入命令行模式:我们在shell环境(提示符为$)下输入启动Vi命令,进入编辑器时 ...

  4. IntellJ 13.x JPA Persistence Sample

    跟上一篇差不多,一些基本的东西. 这次是JPA + Spring MVC 3.0 1.建立Project 2.Add JPA Support 3.我们以Hibernate为例,设置JPA的Provid ...

  5. EXCEL跨工作薄查找。提取信息

    =IF(ISERROR(INDEX(zdy!$B:$B,MATCH(B15,zdy!$B:$B,0))),"不存在",INDEX(zdy!$C:$C,MATCH(B15,zdy!$ ...

  6. android组件间共享数据的常用方法

    使用Intent在激活组件的时候携带数据,以进行数据的传递 使用广播进行组件间数据的伟递 使用外部存储(sharedPreference,文件,数据库,网络)进行组件间数据共享 使用Static静态成 ...

  7. Ajax-Demo

    index.jsp 1 <%@ page language="java" contentType="text/html; charset=UTF-8" p ...

  8. BootStrap glyphicons字体图标

    本章将讲解Bootstrap glyphicons字体图标,并通过一些实例了解它的使用,字体图标是在 Web 项目中使用的图标字体.字体图标在下载的Bootstrap的fonts文件夹中   本章将讲 ...

  9. lstm-思想

    RNN(Recurrent Neural Network) 今天我这里讲到的RNN主要是上图这种结构的,即是Hidden Layer会有连向下一时间Hidden Layer的边,还有一种结构是Bidi ...

  10. ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法

    ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法 转载:http://blog.csdn.net/yao_qinwei/article/details/8761777 在插入模式下,按删 ...