题目描述 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. Commons Configuration2 - Quick start guide

    原文:http://commons.apache.org/proper/commons-configuration/userguide/quick_start.html Reading a prope ...

  2. django 学习-7 模型数据操作

    1.首先还是创建办一个项目和一个应用 django.admin.py   startproject    ssj cd  ssj django.admin.py   startapp    sdj 那 ...

  3. java实现的身份证照片脸部识别(头像截图) 以及OCR字体识别

    断断续续地折腾了大半个月,终于把身份证照片脸部识别以及OCR字体识别功能用Java实现了,需求很简单:通过摄像头所照的一张放在黑色底板上的身份证照,识别照片上身份证里面的人名和地址(OCR中文),再截 ...

  4. 第三篇、image 设置圆角的几种方式

    第一种: 就拿view来举例 view.layer.masksToBounds=YES; //设置为yes,就可以使用圆角 view.layer.cornerRadius= ; //设置它的圆角大小 ...

  5. Swift属性

    属性的存储 属性的主要作用是存储数据,可以常量属性和变量属 性: struct FixedLengthRange { var firstValue: Int let length: Int } var ...

  6. PHP学习笔记 - 入门篇(4)

    PHP学习笔记 - 入门篇(4) 什么是运算符 PHP运算符一般分为算术运算符.赋值运算符.比较运算符.三元运算符.逻辑运算符.字符串连接运算符.错误控制运算符. PHP中的算术运算符 算术运算符主要 ...

  7. (转)IDG副总裁楼军:顶级VC青睐什么样的创业者

    学习能力是创业者的第一能力 创业者首先要有格局观和很强的学习能力. 具体什么意思?比如说去年IDG投了一个做C2C平台的海淘项目,创始人之前其实是帮他爱人做海淘代购.他爱人是一个代购买手,赚得还不错, ...

  8. 暑假集训(4)第六弹——— 组合(poj1067)

    题意概括:上一次,你成功甩掉了fff机械兵.不过,你们也浪费了相当多的时间.fff团已经将你们团团包围,并且逐步 逼近你们的所在地.面对如此危机,你不由得悲观地想:难道这acm之路就要从此中断?虽然走 ...

  9. C++多线程技术windows常用方法

    随着计算机CPU计算能力快速提高,计算机的处理性能和并行性能力也大大提升.那么,一味使用运行时标准库的C++语言也应该开始支持多线程技术.今天,我为大家带来了C++在windows平台下的常用多线程方 ...

  10. GetStartupInfo 反调试

    在使用 CreateProcess 创建进程时,需要传递 STARTUPINFO 的结构的指针,而常常我们并不会一个一个设置其结构的值,连把其他不用的值清0都会忽略,而 ollydbg 也这样做了,我 ...