1874 素数和最大 - Wikioi
题目描述 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的更多相关文章
- wikioi 1430 素数判定
/*====================================================================== 题目描述 Description 质数又称素数.指在一 ...
- wikioi 1434 孪生素数 水题、素数模版
1434 孪生素数 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 输出100以内的所有相差6的孪生素数:如, 5 11 7 13 ...
- Help Hanzo (素数筛+区间枚举)
Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000). (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼 ...
- Java 素数 prime numbers-LeetCode 204
Description: Count the number of prime numbers less than a non-negative number, n click to show more ...
- 求解第N个素数
任务 求解第 10,0000.100,0000.1000,0000 ... 个素数(要求精确解). 想法 Sieve of Eratosthenes 学习初等数论的时候曾经学过埃拉托斯特尼筛法(Sie ...
- 使用BitArray判断素数
首先显示1024范围内的所有素数,然后显示输入的数是否是素数.1024 是代码中计算的素数的范围,可以修改.计算平方根,是为了确定一个基数的范围.1024的平方根是32,两个超过32 的数相乘,肯定大 ...
- 查找素数Eratosthenes筛法的mpi程序
思路: 只保留奇数 (1)由输入的整数n确定存储奇数(不包括1)的数组大小: n=(n%2==0)?(n/2-1):((n-1)/2);//n为存储奇数的数组大小,不包括基数1 (2)由数组大小n.进 ...
- Openjudge 1.13-23:区间内的真素数(每日一水)
总时间限制: 1000ms 内存限制: 65536kB 描述 找出正整数 M 和 N 之间(N 不小于 M)的所有真素数.真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为 ...
- java语言 打印素数实例
//根据定义判断素数---循环n-1次,当n很大时循环n次 public static void main(String[] args) { // TODO Auto-generated ...
随机推荐
- button轮番点击,只点击一次,鼠标hover
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...
- webkit,HTML5头部标签
大家都知道在移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析html代码,更好地将移动web前端页面表现出来.本文整理一些HTML5头部<meta>标签常用的 ...
- css3 巧用结构性伪类选择器
最近在国外的一个网站上看到的一个关于结构性伪类选择器的用法,觉得十分实用,就自己尝试了一下,并把它给记录下来: 这是最基本的样式: <style type="text/css" ...
- java演示适配器(adapter)模式
为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...
- Nginx - SSI Module
SSI, for Server Side Includes, is actually a sort of server-side programming language interpreted by ...
- AIDL实现Android IPC
1.AIDL文本解释 在软件工程中,接口定义语言(IDL)已经成为通用术语,是用来描述软件组件接口的特定语言.在Android中,该IDL被称为Android接口定义语言(AIDL),它是纯文本文件, ...
- TFS2012常见问题及解答
1.删除workItem工作项(包括Bug,用户场景,任务等) 需要利用到witadmin工具,目录在cd %programfiles%\Microsoft Visual Studio 11.0\Co ...
- Delegate&Event
Delegate 1.基本类: public class Student { public int Id { get; set; } public string Name { get; set; } ...
- c#基础学习汇总----------继承
封装,继承,多态.这是面向对象的思想,也可以说是最基本的东西.说到继承,直接的说他就是面向对象中类与类之间的一种关系.通过继承,使得子类具有父类公有的受保护访问权限的属性和方法,同时子类可以通过加入新 ...
- 总是你 2008-3 (献给L之一)
文/安然 总是你 是梦里的那份最温柔 轻轻碰触 不再敢轻易提及 总是你 是不经意的那份最感动 点点鲜活 从来就没有淡去 时间远走 我轻轻的收起 那段记忆 不再开启 但是 偶尔 偶尔 总是 总是在不经意 ...