3318. 【BOI2013】Brunhilda的生日
Description
除去对铁质盔甲强烈的热爱,Brunhilda是一个正常的7岁女孩。近期,她正在策划一个完美的生日派对。她发明了如下的一个游戏:所有的孩子在一个数k被宣读之前不停地跑来跑去。当这个数字k宣读后,所有的孩子将形成人数恰好为k的若干群体,且保证剩余的孩子数目小于k。最后,这不足k个的孩子将从游戏中被淘汰。紧接着,比赛将继续进行,并公布一个新的数字k。游戏将在所有的孩子都被淘汰后结束。
Brunhilda请她的父亲Wotan在游戏中来宣读数字。Wotan不喜欢这个游戏,当然也不希望在游戏的第一轮就宣布一个正无穷(PS:宣布正无穷等于将所有的孩子都从游戏中淘汰)。 Brunhilda认为这在派对上是相当尴尬的情形,所以她给了她父亲一串共计m个素数的列表。这样,她的父亲便可以从中进行选择。当然,相同的数字在游戏中可以被多次宣读。
Wotan想尽快结束比赛,因为他有一张他最喜欢的足球俱乐部 FC Asgard的比赛门票。不幸的是,Brunhilda不知道派对上参加游戏的孩子数目。现在,对于Q个不同的数n1,...,nQ个儿童,Wotan要预先知道他所需宣读的最少数字,以便他尽早结束游戏。
Input
第一行包含整数m和Q。
第二行包含m个不同的递增素数pi(1≤i≤M),表示Wotan可以宣读的数字。
接下来Q行分别包含一个整数nj(1≤j≤Q),表示可能参加游戏的孩子数目nj。
Output
输出包括Q行。第j行表示对于询问nj所得到的答案,即如果Wotan能结束游戏,请输出他最少所需要宣读的数字个数,否则输出字符串oo(两个小写字母o表示∞)。
Sample Input
2 22 356
Sample Output
3oo
Data Constraint
20%的数据:m,nj,Q<=10000.
另有20%的数据:Q=1
100%的数据:1<=m,Q<=100 000,1<=nj<=10 000 000,2<=pi<=10 000 000
Solution
dp。设f[i]表示人数为i时最小宣读数字个数,转移只需要枚举j,f[ i ]=min(f[ i ],f[ i - i%p[ j ]+1 ])。但是这样时超。
考虑优化。
显然当i>p[1]*p[2]*...*p[m]时,f[i]=oo
然而没什么用。
我们可以发现f数组是单调不下降的,并且考虑一个 i,它可以由 i - i%p 转移过来,反过来,设k= i-i%p,则有k为p的倍数,k可以转移到k+i%p,因为i%p取0~p-1,所以k实际上可以转移到k+1~k+p-1。所以答案应该是连续的一段1,然后是连续一段2,以此类推。因此,我们需要在做答案是1的那一段时将答案为2的那一段的右端点求出来,然后一段一段做就可以了。若要求下一段的右端点,我们可以预处理出p数组,p[i]表示i的最大的在给定的素数中出现过的素因子。那么下一段的右端点即为max{i+p[i]-1}。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define F(i,a,b) for(int i=a;i<=b;i++)
#define N 10000000
using namespace std;
int f[N+10],p[N+10],n,m,x,l,r,t,tot=0;
int main(){scanf("%d%d",&n,&m);F(i,1,n){scanf("%d",&x);r=x-1;for(int j=x;j<=N;j+=x) p[j]=x;}l=1;while(l<=r&&r<=N){tot++;F(i,l,r){f[i]=tot;t=max(t,i+p[i]-1);}t=min(t,N);l=r+1;r=t;}while(m--){scanf("%d",&x);if(!f[x]) printf("oo\n");else printf("%d\n",f[x]);}return 0;
}
作者:zsjzliziyang
QQ:1634151125
转载及修改请注明
本文地址:https://blog.csdn.net/zsjzliziyang/article/details/95102501
3318. 【BOI2013】Brunhilda的生日相关推荐
- 3318. 【BOI2013】Brunhilda的生日 (Standard IO)
Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Description 除去对铁质盔甲强烈的热爱,Brunhilda是一 ...
- jzoj3318-[BOI2013]Brunhilda的生日【数论】
正题 题目大意 序列aaa有mmm个质数.然后询问一个数nnn,每次可以使n=n−n%ain=n-n\%a_{i}n=n−n%ai 求最少操作次数. 解题思路 首先我们设fif_ifi表示由iii ...
- 欢乐纪中某A组赛【2019.7.8】
前言 你以为我是jzojjzojjzoj,其实我是GMojGMojGMoj哒 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 上至222分XJQXJQXJQ,下至200ZZY200ZZY200Z ...
- 【2019暑假集训】07.08比赛总结
又双㕛叕自闭了... 比赛思路 一上来看到T1感觉是什么奇奇怪怪的数论题目,又看了看T2发现是一道水题,再看看T3感觉可以搞一搞DP. T1思考了一会儿只会一个NM的DP(暴力),转战T2,不久就把T ...
- python生日提醒_python, 实现朋友家人年历生日自动提醒
为了方便提醒自己,今天有哪位朋友过生日(年历生日). 测试环境:fedora25桌面版. 建立一个生日配置文件,注意:按日期排好序 vi /etc/birthday.txt 朋友A 1-4 朋友C 2 ...
- HDU1201 18岁生日【日期计算】
18岁生日 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- linux生日_代码简介:让我们用25个Linux事实来庆祝Linux的25岁生日。
linux生日 Here are three stories we published this week that are worth your time: 这是我们本周发布的三个值得您关注的故事: ...
- PyTorch迎来5岁生日,创始人带领大一实习生开发:没想到会这么成功
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨量子位 编辑丨极市平台 导读 PyTorch公开发布5周年! ...
- python制作生日祝福_【中信项目案例分享】python 实现自动生成个性化生日贺卡...
python 处理图片 1. 图片上添加文字 1.1 代码部分 代码原理: 创建与原图同等大小的一张图片, 设置透明度为 0, 将两张同大小的图片重叠 from PIL import Image,Im ...
最新文章
- BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)
- 独立云计算服务商的多维实践之道:用户需求驱动变革
- Hadoop学习13--zookeeper相关
- Laravel 中查询 where 记录
- Matlab 图像处理相关函数命令
- Android编译环境(1) - 编译Native C的模块
- python--split方法
- 记录一次Tomcat内存泄露原因的追溯
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_1_File类的概述
- VS添加lib库文件步骤
- 绝对式编码器的ssi协议 stm32 hal
- 《python黑帽子 黑客与渗透测试编程之道》第二章-网络基础 tcp、udp客户端、服务端
- Idea中使用maven命令
- 从fototool谈景深与超焦距
- JAVA NIO介绍及使用
- vite.config 配置文件
- opencv 求矩阵的逆
- Congfu Xu's HomePage
- 基于EMC的共模干扰与差模干扰以及抑制方法
- sublimeText3编辑器使用大全
热门文章
- 计算机毕业设计android的家庭理财app系统(源码+系统+mysql数据库+Lw文档)
- Fruity Loops Studio2022最新版水果音乐编曲软件
- 整理了几个100%会踩的Python细节坑,提前防止脑血栓
- jQuery实现品优购放大镜案例
- 大学生学习网站哪里找?收好这15个网站
- arcgis for js实现三维地图架构
- 【AI折腾录】stable web ui基础【sd安装、lora vae embedding hyperwork等基础概念】
- 安卓开发使用mupdf实现pdf文件的预览
- 歧视来源于偏见,偏见来源于无知。改变不了环境就只能搞钱
- 疫情之后,企业经营模式将发生重大变化