尽管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细胞分裂的更多相关文章

  1. #include <NOIP2009 Junior> 细胞分裂 ——using namespace wxl;

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  2. 洛谷 P1069 细胞分裂 解题报告

    P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...

  3. #include &lt;NOIP2009 Junior&gt; 细胞分裂 ——using namespace wxl;

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  4. P1069 细胞分裂

    P1069 细胞分裂 考虑质因数分解 先将m1,质因数分解后再根据数学定理将所有质数的质数全乘m2 然后将输入的数据相同处理,再判断 顺便说一下判断规矩 1肯定不行 如果分解后有没有m1质因数分解中的 ...

  5. luogu P1069 细胞分裂

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  6. 细胞分裂(洛谷 P1069)

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  7. cogs 466. [NOIP2009] 细胞分裂

    466. [NOIP2009] 细胞分裂 ★★   输入文件:cell.in   输出文件:cell.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]    Hanks ...

  8. 洛谷—— P1069 细胞分裂

    https://www.luogu.org/problem/show?pid=1069#sub 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细 ...

  9. 【p093】细胞分裂

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家.现在,他正在为一个细胞实验做准备工作 ...

随机推荐

  1. JSP大文件上传断点续传解决方案

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  2. JavaScript 的基本概念( ES5 )

    语法 区分大小写 标识符 第一个字符必须是一个字母,下划线或者一个美元符( $ ).其他规则无论,最好按照通用的驼峰大小写. 注释 // 单行注释 /* 多行注释 */ 严格模式 在顶部添加如下代码 ...

  3. 微信支付(公众号)爬坑记,包含 total_fee 失败和 JSAPI 签名验证失败等等

    做商城类网站不免会需要做支付功能,目前在中国大陆通用的做法就是使用支付宝支付和微信支付,上一篇博文已经讲个支付宝支付. 这篇文章来讲一讲微信支付,微信支付的方式有很多种,本文主要讲 JSAPI 支付的 ...

  4. java web项目启动时浏览器路径不用输入项目名称方法

    http://blog.csdn.net/qq542045215/article/details/44923851

  5. C++入门经典-例5.17-右值引用的定义

    1:右值引用的定义: 类型 && i=被引用的对象: 左值与右值的区别在于,右值是临时变量,例如,函数的返回值,并且无法被改变. 当右值引用被初始化后,临时变量消失. 代码如下: // ...

  6. 查准率(precision)和召回率(recall)

    1.定义 查准率(precision):预测患有癌症且预测正确的人数 / 预测有多少人患有癌症 召回率(recall):预测患有癌症且预测正确的人数 / 实际有多少人患有癌症 2.关系 他俩的关系如下 ...

  7. ES6 方法函数

    1.模块的整体加载 除了指定加载某个输出值,还可以使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面. 下面是一个circle.js文件,它输出两个方法area和circumfe ...

  8. IP处理模块IPy

    #安装IPy模块#pip install IPy #from IPy import IPip_s = input('please input an IP or net-range:')#192.168 ...

  9. Shell实现交互式登陆一台同时管理多台机器

    最近为了检测公司服务器的硬盘需要开10多台服务器的僚机来检测服务器,可是这10来台都是操作一样的命令,挨个操作下去太麻烦了 然后就想到了交互式登陆 这里需要创建一个Ip文件夹把你的Ip账户密码都放进去 ...

  10. java 设计模式 单例模式之饿汉模式/懒汉模式 singleton pattern

    https://v.qq.com/x/page/e0364ung5zp.html 讲的不错, 关于 饿汉式单例模式 code Student 类: package com.test;//单例模式之   ...