洛谷 P1069细胞分裂题解--zhengjun
2022/6/10 23:20:15
本文主要是介绍洛谷 P1069细胞分裂题解--zhengjun,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题面传送门
思路
一看,不就是一个分解质因数吗?
这里使用欧拉筛筛素数,如果不会,可以用埃氏筛,反正代码都差不多。
进入正题。
以第二个样例为例:
2 24 1 30 12
先处理出素数表\(prime\)。(我喜欢欧拉筛)
然后分解质因数,用\(a_i\)表示第\(i\)个素数有几个。(主要是省空间)
然后分解出来
\(24^1=2^3\times3^1\)
\(30=2^1\times3^1\times5^1\)
\(12=2^2\times3^1\)
为了让\(S_i\)整除\(m_1^{m_2}\),就要让\(S_i\)乘上一个数,也就是每一个质因数乘上它,使每一个质因数都要\(\ge\)\(m_1^{m_2}\)的质因数。
然后,就找一个最小的\(S\),输出就可以了
代码
#include<bits/stdc++.h> using namespace std; int prime[6001],f[100000]; void init(int n){ for(int i=2;i<=n;i++){ if(!f[i])prime[++prime[0]]=i; for(int j=1;j==1||(prime[j-1]*i<=n&&i%prime[j-1]!=0);j++) f[prime[j]*i]=1; } } void get(int a,int *b){ for(int i=1;i<=prime[0]&&a>1;i++)while(a%prime[i]==0)b[i]++,a/=prime[i]; } int p(int *a,int *b){ int t=0; for(int i=1;i<=prime[0];i++){ if(a[i]>0&&b[i]==0){//无论怎么乘都达不到 t=0x3fffffff; break; } if(a[i]!=0){ t=max(t,(int)ceil(double(a[i])/b[i]));//因为至少要大于,所以要用ceil,而ceil结果是double,所以还要强制转换 } } return t; } int n; int m1,m2; int s[10001]; int main(){ init(30000);//预处理素数表 scanf("%d%d%d",&n,&m1,&m2); int a[50001],b[50001]; get(m1,a); for(int i=1;i<=prime[0];i++)a[i]*=m2; int ans=0x3fffffff; for(int i=1;i<=n;i++){ int k; scanf("%d",&k); memset(b,0,sizeof(b));//这句话十分重要 get(k,b); ans=min(ans,p(a,b)); } if(ans==0x3fffffff)printf("-1"); else printf("%d",ans); return 0; }
谢谢--zhengjun
这篇关于洛谷 P1069细胞分裂题解--zhengjun的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南