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 ...
随机推荐
- Commons Configuration2 - Quick start guide
原文:http://commons.apache.org/proper/commons-configuration/userguide/quick_start.html Reading a prope ...
- django 学习-7 模型数据操作
1.首先还是创建办一个项目和一个应用 django.admin.py startproject ssj cd ssj django.admin.py startapp sdj 那 ...
- java实现的身份证照片脸部识别(头像截图) 以及OCR字体识别
断断续续地折腾了大半个月,终于把身份证照片脸部识别以及OCR字体识别功能用Java实现了,需求很简单:通过摄像头所照的一张放在黑色底板上的身份证照,识别照片上身份证里面的人名和地址(OCR中文),再截 ...
- 第三篇、image 设置圆角的几种方式
第一种: 就拿view来举例 view.layer.masksToBounds=YES; //设置为yes,就可以使用圆角 view.layer.cornerRadius= ; //设置它的圆角大小 ...
- Swift属性
属性的存储 属性的主要作用是存储数据,可以常量属性和变量属 性: struct FixedLengthRange { var firstValue: Int let length: Int } var ...
- PHP学习笔记 - 入门篇(4)
PHP学习笔记 - 入门篇(4) 什么是运算符 PHP运算符一般分为算术运算符.赋值运算符.比较运算符.三元运算符.逻辑运算符.字符串连接运算符.错误控制运算符. PHP中的算术运算符 算术运算符主要 ...
- (转)IDG副总裁楼军:顶级VC青睐什么样的创业者
学习能力是创业者的第一能力 创业者首先要有格局观和很强的学习能力. 具体什么意思?比如说去年IDG投了一个做C2C平台的海淘项目,创始人之前其实是帮他爱人做海淘代购.他爱人是一个代购买手,赚得还不错, ...
- 暑假集训(4)第六弹——— 组合(poj1067)
题意概括:上一次,你成功甩掉了fff机械兵.不过,你们也浪费了相当多的时间.fff团已经将你们团团包围,并且逐步 逼近你们的所在地.面对如此危机,你不由得悲观地想:难道这acm之路就要从此中断?虽然走 ...
- C++多线程技术windows常用方法
随着计算机CPU计算能力快速提高,计算机的处理性能和并行性能力也大大提升.那么,一味使用运行时标准库的C++语言也应该开始支持多线程技术.今天,我为大家带来了C++在windows平台下的常用多线程方 ...
- GetStartupInfo 反调试
在使用 CreateProcess 创建进程时,需要传递 STARTUPINFO 的结构的指针,而常常我们并不会一个一个设置其结构的值,连把其他不用的值清0都会忽略,而 ollydbg 也这样做了,我 ...