【6.18校内test】T3细胞分裂
尽管T1T2很简单,但还是阻止不了我T3wa一片
xcg同学有一个80pts的代码
他说他的代码和我的很像,可惜我比较笨,只有30pts
其实这道题考场上是想到要分解质因数了,然后我质数表都打好了,但是不知道怎么记录乱七八糟的东西,然后就只会打暴力惹qwq
代码能力还是有待提升啊qwq
关于思路,就是上面所说的分解质因数,我们在分解质因数时,也只需要分解m1而不需要去分解m1m2,因为分解完质因数之后,对于它的m2次方,每个质因数的个数(也就是指数)都是m1所对应的这个质因数的个数(指数)*m2(应该是可以理解的哈)
其实当分解完样例的质因数就会豁然开朗的,除了你不会写之外,数学部分绝对是很容易理解的。
首先如果a%b==0,那么a的质因数中一定含有b所有的因数(当然b不一定含有a所有的因数),放到这个题中就是输入的数si的某次方一定含有m1m2的所有因数,当si所含的某个因数j的数量cnt1<m1m2中所含的j因数数量cnt2时,我们需要通过*si来使si的j因数数量>=m1m2中所含的j因数数量cnt2。这就是本题的基本思路。
其实思路都好说,然后代码实现是最神(dan)奇(teng)的;(咱就是因为不会实现然后才写暴力的)
首先开一个结构体,结构体中的变量:
cnt 记录某个数的质因数个数
pn[maxn]记录每个质因数的值
t[maxn]记录每个质因数的指数(也就是有多少个此质因数)
然后有两个结构体变量:
p,q;分别记录m1的质因数分解情况,输入的某个数si的质因数分解情况
然后是zysfj,具体的为啥真的不想写了,看代码+注释吧(当然也可以打表质数求qwq)
inline void fenjie(int t,prime& p)//质因数分解
{
p.cnt=;
for(int i=;i*i<=t;++i)
//至于为什么我们可以不用去枚举质数而是枚举每个数是因为如果某个合数是它的因数
//那么这个合数一定可以看成几个质数的乘积,因此只有质数才起到被分解的效果
{
if(!(t%i))//如果某个数是t的因数
{
p.pn[++p.cnt]=i;//记录第cnt个约数
p.t[p.cnt]=;
do//记录某个约数的个数
{
t/=i;
++p.t[p.cnt];//次数
}while(!(t%i));
}
} if(t>){//如果枚举到最后t大于1,那么此时的t值就是最后一个约数
p.pn[++p.cnt]=t;
p.t[p.cnt]=;
}
}
最后是main函数处理部分:
首先有一个特殊情况,那就是m1==1的情况,此时无论m2等于多少,都不需要分裂就可以得到满足题意的细胞数(如果不特判好像会一直循环然后TLE掉)
首先定义ans=-1(这样不更新的话就可以直接输出-1啦),
然后对于每输入的一个数,都先进行质因数分解,存到q中,然后几个判断退出的情况:
- 我们知道将一个数乘方之后,乘方后的质因数与乘方前的质因数不同在于指数不同,而不会平白无故多出一些其他质因数,因为题目要求m1m2∣sit因此m1中所有的质因数si都必须要有至少一个,那么假设我们分解完si的质因数之后,发现si的质因数个数<m1的质因数个数,那么说明m1一定有si没有的质因数,那么无论怎样乘方,都无法达成m1m2∣sit,可以直接break掉;
- 当第一个条件满足之后,就可以开始枚举m1与si的质因数了,首先枚举m1的每一个质因数(这里的质因数应该是从小到大排列的),用while循环来找出si中第一个>=(当前枚举的m1某个质因数)的质因数,显然因为分解时我们是从小到大枚举的,因此储存质因数也是从小到大,这样用while循环寻找后,如果找到的si的质因数>m1的质因数,也就说明si不含有m1的某个质因数,永远无法均分,所以可以直接退出(当然还有找遍整个循环也没有找到某个质因数的情况)
当我们在si中找到了m1的某个质因数,为了满足整除的条件,sit所含的此质因数的个数(也就是指数)必须要大于m1m2所含的质因数个数(指数),那么就可以:
分裂次数=m1的某个质因数个数*m2/si对应的此质因数个数(每次分裂都相当于乘一个si),然后向上取整(保证不会出现整除小1的情况)
对于m1的每一个质因数都要进行此操作,寻找一个最大值(因为最后要保证sit每个质因数指数都大于等于m1^m2)
然后对于每个si,记录每个si如果要整除m1^m2要乘方次数的最小值,最后输出这个最小值(如果没有满足条件的就输出‘-1’);
以下是完整CODE:(from ych)
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
}
struct prime{
int cnt,pn[],t[]/*t[i],第i个质因数的次数*/;
}p,q;//一个储存题目给的条件,一个储存判断
int n,m1,m2;
inline void fenjie(int t,prime& p){//质因数分解
p.cnt=;
for(int i=;i*i<=t;++i){
//至于为什么我们可以不用去枚举质数而是枚举每个数是因为如果某个合数是它的因数
//那么这个合数一定可以看成几个质数的乘积,因此只有质数才起到被分解的效果
if(!(t%i)){//如果某个数是t的因数
p.pn[++p.cnt]=i;//记录第cnt个约数
p.t[p.cnt]=;
do{//记录某个约数的个数
t/=i;
++p.t[p.cnt];//次数
}while(!(t%i));
}
}
if(t>){//如果枚举到最后t大于1,那么此时的t值就是最后一个约数
p.pn[++p.cnt]=t;
p.t[p.cnt]=;
}
}
int main(){
n=read(),m1=read(),m2=read();
if(m1==) return cout<<<<endl,;//先判断一波特殊情况
fenjie(m1,p);//把m1分解,存到p里
int ans,x;
ans=-;
for(int i=;i<=n;i++){
x=read();
fenjie(x,q);
int maxn=,nxt=;
//我们用nxt来存储x的下一个质因子的序号
bool flag=false;
if(q.cnt>=p.cnt)
//只有要求判断的数的质因子的个数>=题目给的条件的质因子的个数才能继续
for(int j=;j<=p.cnt;j++){//枚举m1的每一个质因子
while(q.pn[nxt]<p.pn[j]&&nxt<=q.cnt)++nxt;
if(nxt>q.cnt||q.pn[nxt]>p.pn[j])break;//如果没有这个质因子就跳出
int f=p.t[j]*m2/*m1^m2中含有多少个数值为p.pn[j]的因子*//q.t[nxt];
if((p.t[j]*m2)%(q.t[nxt])) f++;
//让这两个次数相等,因为有可能不整除,所以还要判断一下,相当于向上取整
if(maxn<f)maxn=f;//求最大值
if(j==p.cnt) flag=; //标记答案
else flag=;
}
if(flag&&(ans==-||ans>maxn))ans=maxn;
}
printf("%d\n",ans);
return ;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath> using namespace std; int db[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
int n,m1,m2,s,ans; struct node{
int cnt,pn[],num[];
}p,q; inline void fjzys(int a,node& g){
for(int i=;i<&&a;i++){
if(a%db[i]!=) continue;
g.pn[++g.cnt]=db[i];
while(!(a%db[i])){
a/=db[i];
g.num[g.cnt]++;
}
}
} int main(){
scanf("%d",&n);
scanf("%d %d",&m1,&m2);
if(m1==){
cout<<<<endl;return ;
}
fjzys(m1,p);ans=-;
for(int i=;i<=n;i++){
scanf("%d",&s);
memset(q.num,,sizeof(q.num));
memset(q.pn,,sizeof(q.pn));
q.cnt=;
fjzys(s,q);
bool flag=;
if(q.cnt<p.cnt) continue;
int cnt1=,maxn=;
for(int j=;j<=p.cnt;j++){
while(q.pn[cnt1]<p.pn[j]&&cnt1<=q.cnt) cnt1++;
if(q.pn[cnt1]>p.pn[j]||cnt1>q.cnt) break;
int f=p.num[j]*m2/q.num[cnt1];
if((p.num[j]*m2)%(q.num[cnt1])) f++;
if(f>maxn) maxn=f;
if(j==p.cnt) flag=;
}
if(flag==&&(ans==-||ans>maxn)) ans=maxn;
}
cout<<ans<<endl;
}
混迹其中
大概的思路就是这样啦;
end-
【6.18校内test】T3细胞分裂的更多相关文章
- #include <NOIP2009 Junior> 细胞分裂 ——using namespace wxl;
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...
- 洛谷 P1069 细胞分裂 解题报告
P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...
- #include <NOIP2009 Junior> 细胞分裂 ——using namespace wxl;
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...
- P1069 细胞分裂
P1069 细胞分裂 考虑质因数分解 先将m1,质因数分解后再根据数学定理将所有质数的质数全乘m2 然后将输入的数据相同处理,再判断 顺便说一下判断规矩 1肯定不行 如果分解后有没有m1质因数分解中的 ...
- luogu P1069 细胞分裂
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...
- 细胞分裂(洛谷 P1069)
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...
- cogs 466. [NOIP2009] 细胞分裂
466. [NOIP2009] 细胞分裂 ★★ 输入文件:cell.in 输出文件:cell.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] Hanks ...
- 洛谷—— P1069 细胞分裂
https://www.luogu.org/problem/show?pid=1069#sub 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细 ...
- 【p093】细胞分裂
Time Limit: 1 second Memory Limit: 128 MB [问题描述] Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家.现在,他正在为一个细胞实验做准备工作 ...
随机推荐
- Python天天学_04_基础四
Python_day_04 金角大王: http://www.cnblogs.com/alex3714/articles/5765046.html ------Python是一个优雅的大姐姐 学习方式 ...
- CF1073D Berland Fair 二分+线段树
考场上切的,挺简单的~ Code: #include <cstdio> #include <algorithm> #define N 200005 #define inf 10 ...
- 关键字static在标准C/C++的作用
static总结:根据作用域,存储域,生命周期3点来说 static含义: 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. (1)标准C语言中,static的最主要功能是隐藏,其次 ...
- 洛谷 P1546 最短网络 Agri-Net x
题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其 ...
- JS框架_(JQuery.js)动画效果鼠标跟随
百度云盘 传送门 密码 :4n9u 火狐浏览器上纯CSS_动画效果鼠标跟随效果: (作者:lily_lcj 传送门) <!DOCTYPE html PUBLIC "-//W3C//DT ...
- Spring boot之热部署
springboot热部署 1.springloaded(热部署) 2.devtools(热部署) 一.springloaded 问题的提出: 在编写代码的时候,你会发现我们只是简单把打印信息改变了, ...
- idea 编译内存溢出
idea.max.intellisense.filesize=9999 idea.max.content.load.filesize=99999 idea.cycle.buffer.size=disa ...
- Eclipse控制台输出中文乱码问题的解决
啥都不说,上图: 1.console控制台打印乱码 2.右键: Run As --> Run Configurations 3.找到common项,在“Encoding”栏,看到当前用的是默认“ ...
- Swagger常用参数用法
别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/m ...
- 威胁猎杀实战(三):基于Wazuh, Snort/Suricata和Elastic Stack的SOC
https://www.secpulse.com/archives/81629.html