【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,生物技术)领域的知名专家.现在,他正在为一个细胞实验做准备工作 ...
随机推荐
- redis-cli批量删除key
https://www.cnblogs.com/kiko2014551511/p/11531584.html redis-cli -a 密钥 keys "shiro*" | xar ...
- 网页“console”输出图文信息
http://www.monmonkey.com/javascript/jiben2.html 参考以上链接中的转义字符使用. http://www.cnblogs.com/Wayou/p/chrom ...
- Luogu2000 拯救世界
题目链接:戳我 生成函数的入门题吧. 我们可以把条件限制转化为生成函数,然后用第i项的系数来表示一共使用n块石头的方案个数. (你问我为什么?你可以自己演算一下,或者去看大佬的博客-->这里面讲 ...
- malloc,calloc,realloc
与堆操作相关的两个函数 malloc #include<stdio.h> #include<stdlib.h> #include<string.h> int mai ...
- Unity3D_(游戏)2D简单游戏制作过程:捕获高空掉落保龄球
游戏介绍:通过鼠标的左右移动,可以控制帽子的移动,当帽子接到下落的保龄球时,会出现火花效果.没有接到保龄球时,保龄球落到草地上,过10S后会自动消失. 实现效果: 素材+Unity3D源代码:传送 ...
- IDEA基础配置
详细IDEA使用请参考 https://www.w3cschool.cn/intellij_idea_doc/ 下面的内容都是从别人手中收集之后整理的: 全局设置 修改主题 修改字体 修改控制台字体 ...
- TCP定时器 之 TIME_WAIT定时器
概述 在FIN_WAIT_2收到对端发来的FIN,并回复ACK之后,会进入TIME_WAIT状态,此时添加定时器,定时器超时会将tw控制块从ehash和bhash中删除,并且释放tw控制块: 启动定时 ...
- 字符串 kotlin(6)
字符串用 String 类型表示.字符串是不可变的. 字符串的元素——字符可以使用索引运算符访问: s[i] . 可以用 for 循环迭代字符串: for (c in str) { println(c ...
- RF Setup和Teardown的使用
执行顺序 setup执行顺序是:project级别setup>suite级别setup>case级别setup 无返回值 Run Keywords | [KW1 | arg1 | arg2 ...
- 实现一个可以用 await 异步等待的 Awaiter
总结起来,要想使一个方法可被 await 等待,必须具备以下条件: 这个方法返回一个类 A 的实例,这个类 A 必须满足后面的条件.此类 A 有一个可被访问到的 GetAwaiter 方法(扩展方法也 ...