题目:###


描述##

有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值。

输入##

共两行。

第一行一个正整数n。

第二行n个正整数a[i]。

输出##

共一行

一个正整数m。

样例输入##

1

6

样例输出##

3


看到这个题目描述只有一行我心头就涌上一股不祥的预感……

一般这种题……都比较……那啥……

(是的,这个题我又写炸了……

好的让我们来分析一下这道题:

分析:###

首先我们可以知道,如果一个数的阶乘对输入的数的乘积取模等于零(实际上就是它的倍数),那么这个数m!一定是包含了输入数据相乘的所有质因子的,所以我们在读入数据的时候先把每个数都分解一下质因子,然后存储每个质因子出现的次数。

然后我们来感性理解一个奇怪的结论:

举一个例子:30!中有多少个质因子3?

首先我们把含有3的乘数提取出来,大概长这个样:

3 6 9 12 15 18 21 24 27 30

其中每个数对应含有因子3的个数为: 1 1 2 1 1 2 1 1 3 1

看出什么规律了吗? 每两个一次项过后是一个二次项,每两个二次项过后是一个三次项,后面的规律可以以此类推。

那么这个结论是不是正确的呢?我们感性理解一下:

每一个数都除以一个3,得到的结果是: 1 2 3 4 5 6 7 8 9 10

是不是相当于降下来了一次? 这个时候原先含有一个3的数已经不含3了,而原先含有两个3(二次项)的变成了含有一个3。

较为普适的结论要看这个图理解(我终于稍微不那么感性地搞出了这个玩意……):

这个结论有什么用呢?事实是,用一个函数模拟上面降次的过程,就可以求出x的阶乘中含有的每个质因子的个数。

又显然,m是具有单调性的,即如果(m_i)!是符合题意的数,那么(m_j)!(其中j>i)一定也是符合题意的数(因为(m_j)!%(m_i)!==0),所以我们考虑二分一个m,然后用上面得出的结论来验证m

然后就出答案啦OvO


代码:###

#include<bits/stdc++.h>
using namespace std;
int prime[100005],n,max_prime=-1,x;
inline long long read(){
long long cnt=0,f=1;char c;
c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){cnt=cnt*10+c-'0';c=getchar();}
return cnt*f;
}
bool check(int x){
if(x<max_prime)return false; //如果x已经小于了最大的质因子max_prime,那么x!中一定不含有 max_prime这个质因子,直接return false
for(register int i=2;i<=max_prime;i++){
if(!prime[i])continue;
int xx=x,t=0;
while(xx){
t+=xx/i;
xx/=i;
}
if(t<prime[i])return false; //如果发现这个数的阶乘中某一个质因子的次数小于输入中的质因子的次数则非法
}
return true;
}
int main(){
n=read();
for(register int i=1;i<=n;i++){
x=read();
for(register int j=2;j<=sqrt(x);j++)
while(x%j==0)x/=j,prime[j]++,max_prime=max(max_prime,j);
if(x>1)prime[x]++,max_prime=max(max_prime,x);
}
int l=1,r=1e9;
while(l<r){
int mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
printf("%d",l);
return 0;
}

[NOIP2018校模拟赛]T1 阶乘的更多相关文章

  1. [NOIP2018校模拟赛]T1聚会 party

    题目链接: 聚会 分析: 设每个点到1号点的距离为dist_{i},每个点的权值为x_{i},目标点到1号点的距离为dist,权值为x,那么对于每一次查询,我们讨论三种情况: ① 目标家庭在区间左边( ...

  2. [NOIP2018校模拟赛]T2矩阵分组 Matrix

    题目链接: 矩阵分组 分析: 这道题求的是两部分极差当中大的那个的最小值.对于这种求最值的问题,我们很自然(其实并没有)地想到二分答案. 这个题有两个结论: (好像当时看出来了第一个?然后发现下面都不 ...

  3. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  4. NOI.AC: NOIP2018 全国模拟赛习题练习

    闲谈: 最后一个星期还是不浪了,做一下模拟赛(还是有点小虚) #30.candy 题目: 有一个人想买糖吃,有两家商店A,B,A商店中第i个糖果的愉悦度为Ai,B商店中第i个糖果的愉悦度为Bi 给出n ...

  5. 20180610模拟赛T1——脱离地牢

    Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想着得到这两块石头了,只要 ...

  6. NOIP欢乐模拟赛 T1 解题报告

    小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...

  7. [模拟赛] T1 高级打字机

    Description 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小 ...

  8. 【洛谷】NOIP2018原创模拟赛DAY1解题报告

    点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...

  9. 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物

    T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...

随机推荐

  1. zabbix基于SNMP 协议监控路由器

    zabbix基于SNMP 协议监控路由器 步骤 步骤超级方便. 1. 路由器上开启snmp 2. 确保外网能訪问到 3. 用snmpwalk測试 4. 加入zabbix主机,SNMP interfac ...

  2. Robotium结果的收集和失败重跑

    引用自 http://www.robotium.cn/archives/author/zered 测试用例: testsuite管理测试用例 测试结果的输出与收集? InstrumentationTe ...

  3. Java 线程池ThreadPoolExecutor简单应用

    什么是线程池: 线程池就是控制线程的一个池子.用来控制线程数量. 为什么要使用线程池: 1.避免系统反复创建和销毁线程影响执行的时间(创建+销毁>>执行时间时) 2.控制线程数量.线程过多 ...

  4. CentOS笔记-系统概述

    Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动. 操作系统接管 ...

  5. 模板方法模式-TemplateMethod

    模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的机构即可以重定义算法的某些特定步骤. 模板方法模式是通过吧不变形为搬移到超类,去除子类中的重复代码 ...

  6. crontab -e 定时任务中的 脚本文件 路径

    crontab -l 57 */1 * * * python /home/data/crontab_chk_url/personas/trunk/plugins/spider/chk_url_stat ...

  7. kafka 和 zookeeper 常用命令记录

    启动zookeeper zkServer.sh start 启动kafka服务器 kafka-server-start.sh /software/kafka_2.10-0.10.2.1/config/ ...

  8. SAP系统更新模块

    SAP 系统中,一些单据保存到数据库用的是 update mudule function. 命名是ME_UPDATE_* (业务说明) 例:PR save module: ME_UPDATE_REQU ...

  9. WIFI的通信知识整理

    这两天在解决wifi芯片的一个底层问题,看了很多资料,下面做一个简要记录: 1.信号调制的基本原理 链接:http://wenku.baidu.com/link?url=3K6Z5fBIN20lPzB ...

  10. Java面试手写代码题

    1.栈实现 2.Iterator实现 3.单例 4.多线和控制(暂停,恢复,停止) 5.生产者消费者