题意

有\(T\)组数据。

给定\(p\),求最小的正整数\(n\),使得\(n!\%p=0\)。

由于\(p\)很大,输入将给出\(m\)和\(e_1,e_2...e_m\),表示\(p=\prod_{i=1}^mpr_i^{e_i}\),其中\(pr_i\)是第\(i\)个质数。

数据范围:设\(a_i=pr_i*e_i(i=1,2...m)\)

\(T<=10^4,m<=100,a_i<=10^{18}\)

思路

注意到\(m\)很小,我们可以预处理出前100个质数。

一个暴力的做法是预处理出\(n!\)里面包含前100个质数的次方数,然后二分\(n\),由于此题的答案上界为\(a_i\),所以不可取。

一个观察是因为\(p=\prod_{i=1}^mpr_i^{e_i}\),可以把\(p\)按照\(pr_i^{e_i}\)拆分开考虑。

假设对于\(p_i=pr_i^{e_i}\),此时的答案为\(ans_i\),那么对于\(p=\prod_{i=1}^mp_i\),

最后的答案一定是\(max(ans_1,ans_2...ans_m)\)。这是显然的。

现在考虑如何求出\(ans_i\)。

等价于满足\(n!\)中包含\(pr_i\)的因子\(>=e_i\)的最小的n。

而\(n!\)中包含\(pr_i\)的因子数为\(\sum_{j=1}^{+\infty}\lfloor\frac{n}{{pr}_i^j}\rfloor\)。

于是我们可以二分\(ans_i\),最后取\(n=max(ans_1,ans_2...ans_m)\)即可。

时间复杂度为\(O(Tmlog^2a_i)\)。

这样只能拿65分。

考虑一个优化,我们二分\(ans_i\)时,可以把下界调整到前面算出来的答案,即\(max(ans_1,ans_2...ans_{i-1})\)。而感觉上\(ans_i\)与\(a_i\)相差不是很大,于是我们可以先求出最大的那个\(a_i\)对应的\(ans_i\),然后把之后的二分下界都改成这个\(ans_i\),这样显然不会对答案造成影响,而之后的\(a_i\)都要比最大的\(a_i\)要小。

时间复杂度为\(O(T(mloga_i+loga_i))\)。

通过了全部数据并且都<=100ms。

代码

# include<bits/stdc++.h>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-8
# define MOD 1000000007
# define INF 1000000000
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(register int i=a; i<=n; ++i)
# define FDR(i,a,n) for(register int i=a; i>=n; --i)
# define bug puts("H");
# define lch p<<1,l,mid
# define rch p<<1|1,mid+1,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
inline LL Scan() {
LL x=0;int f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
const int N=50005;
//Code begin.... int T, m;
LL x;
int a[105];
LL b[105];
struct Node{LL b; int id;}node[105]; void init_p(){
a[0]=2;
int cnt=0, P=2;
while (1) {
++P;
bool flag=false;
FOR(i,0,cnt) if (P%a[i]==0) {flag=true; break;}
if (flag) continue;
a[++cnt]=P;
if (cnt>=99) break;
}
}
LL check(LL x, int id){
LL now=a[id], res=0;
while (now<=x) res+=x/now, x/=now;
return res;
}
LL sol(int id, LL x, LL tmp){
LL l=tmp/a[id], r=x, mid;
while (l<r) {
mid=(l+r)>>1;
if (check(mid*a[id],id)>=x) r=mid;
else l=mid+1;
}
return r*a[id];
}
bool comp(Node c, Node d){return c.b*a[c.id]>d.b*a[d.id];}
int main ()
{
init_p();
scanf("%d",&T);
while (T--) {
LL ans=1, ma=0;
scanf("%d",&m);
bool flag=true;
FOR(i,0,m-1) node[i].b=Scan(), node[i].id=i, ma=max(ma,node[i].b*a[i]);
sort(node,node+m,comp);
FOR(i,0,m-1) {
if (ma/100>node[i].b*a[node[i].id]) continue;
ans=max(ans,sol(node[i].id,node[i].b,ans));
if (node[i].b) flag=false;
}
if (flag) puts("1");
else printf("%lld\n",ans);
}
return 0;
}

LOJ 530 最小倍数(数论)的更多相关文章

  1. $loj530\ [LibreOJ\ \beta\ Round \#5]$ 最小倍数 数论

    正解:数论 解题报告: 传送门$QwQ$! 不想做题,来水点儿简单点的$QwQ$. 一个显然的点在于可以直接对不同质因子分别算$n_{min}$最后取$max$. 这个正确性还是蛮显然的?因为只要有$ ...

  2. [LOJ#530]「LibreOJ β Round #5」最小倍数

    [LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...

  3. 【LOJ#3096】[SNOI2019]数论

    [LOJ#3096][SNOI2019]数论 题面 LOJ 题解 考虑枚举一个\(A\),然后考虑有多少个合法的\(B\). 首先这个数可以写成\(a_i+kP\)的形式,那么它模\(Q\)的值成环. ...

  4. 【数位贪心】loj#530. 「LibreOJ β Round #5」最小倍数

    记录一下题解里写的算法四 题目描述 $1 \le T \le 10^4,1\le m\le 100,0\le a_i\le 10^{18}$. 题目分析 题解里的算法四是这么写的 主要是这个$\alp ...

  5. LOJ#137. 最小瓶颈路 加强版(Kruskal重构树 rmq求LCA)

    题意 三倍经验哇咔咔 #137. 最小瓶颈路 加强版 #6021. 「from CommonAnts」寻找 LCR #136. 最小瓶颈路 Sol 首先可以证明,两点之间边权最大值最小的路径一定是在最 ...

  6. Loj 6002 最小路径覆盖(最大流)

    题意: 求不相交的最小路径覆盖 思路: 连边跑二分图,匹配一条边相当于缩了一条边,答案为n-maxflow 如果是求可以相交的最小路径覆盖的话,先用Floyd跑出可达矩阵,然后所有可达的点连边跑二分图 ...

  7. loj 1034(最小点基)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25911 思路:强连通缩点,在新图中找入度为0的点的个数即可. #i ...

  8. 51Nod 1098 最小方差 (数论)

    #include <iostream> #include <cstdio> #include <algorithm> using namespace std; ty ...

  9. loj#137 最小瓶颈路 加强版

    分析 我们知道答案一定再最小生成树上 于是我们按边权从小到大建立kruskal重构树 然后每次查询lca的值即可 由于询问较多采用st表维护lca 代码 格式化代码 #include<bits/ ...

随机推荐

  1. Vue表单绑定(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)

    <!DOCTYPE html><html>    <head>        <meta charset="utf-8">      ...

  2. Beautiful Soup (一)

    一.Beautiful Soup库的理解 1.Beautiful Soup库可以说是对HTML进行解析.遍历.维护“标签树”的功能库 2.pip install bs4 3.from bs4 impo ...

  3. ROS launch 文件的编写

    ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...

  4. POJ1127 Jack Straws

    给你一些线段,求出哪些线段是相连的,哪些是不相连的.相连包括间接相连,即这两条线段本身不直接相连,而是通过其它线段的连接而间接相连. 线段相交+并查集 这里主要说如何判断线段相交:快速排斥试验+跨立试 ...

  5. 基于Python自动发送QQ群消息

    1.准备工作 此次测试基于python3,需要安装qqbot.bs4.requests库. qqbot项目地址:https://github.com/pandolia/qqbot.git pip qq ...

  6. 【服务器】Https服务配置

    1)利用openssl生成证书 2)再次修改nginx配置文件nginx.conf中的server配置 ① 是默认监听http请求的8080端口的 server    (再次修改,第一次是在 用ngi ...

  7. [HAOI2008]排名系统 & [Zjoi2006]GameZ游戏排名系统 BZOJ1862&BZOJ1056

    分析: 平衡树裸题,(学完LCT感觉自己不会普通的Splay了...),维护每个节点的权值大小顺序,和时间戳顺序,之后map维护一下是否存在过,(懒得写字符串hash了). 附上代码: #includ ...

  8. 20155237 《JAVA程序设计》实验三(敏捷开发与XP实践)实验报告

    20155237 <JAVA程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 敏捷开发与XP实践 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...

  9. 有关C++的数据类型(int,long,short,float,double等等)

    再看C++ prime plus 第六版的时候 对数据类型又一次有些乱了,在看了这篇博客后,重新清晰起来了. 有关C++的数据类型(int,long,short,float,double等等)

  10. 蓝牙inquiry流程之命令下发

    Android 上面的蓝牙inquiry 是在设置界面,打开蓝牙就会自动搜索周边的蓝牙设备,其最终调用到协议栈的start_discovery接口,此篇文章分析该接口的调用流程以及与controlle ...