【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,生物技术)领域的知名专家.现在,他正在为一个细胞实验做准备工作 ...
随机推荐
- PHPmailer类的使用
实现需要下载相关文件:在项目目录中运行 composer require phpmailer/phpmailer 还需要根据PHPinfo(); 确认是否开启了socket扩展和OpenSSL扩展 在 ...
- jquery pageX属性 语法
jquery pageX属性 语法 作用:pageX() 属性是鼠标指针的位置,相对于文档的左边缘. 语法:event.page 参数: 参数 描述 event 必需.规定要使用的事件.这个 ...
- Log4net日志文件自动按月份存放和日志独占问题的解决
让log4net日志文件自动按月份存放 log4net日志文件的作用还真不小,可以保存管理员.用户对数据库的任何操作,保存管理员和用户的登录记录,分析系统运行错误,所以不舍得随便将日志文件Delete ...
- web前端:上传文件夹(需支持多浏览器)
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- poj2386(dfs搜索水题)
Language:Default Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42069 ...
- vue-router中,require代替import解决vue项目首页加载时间过久的问题
vue的路由配置文件(routers.js),一般使用import引入的写法,当项目打包时路由里的所有component都会打包在一个js中,在项目刚进入首页的时候,就会加载所有的组件,所以导致首页加 ...
- supsplk 服务器被植入木马 挖矿 cpu使用 700%
最近emr集群跑任务的时候总出现 task failed ,优化sql,调提交任务参数都没解决,最后再我排查时候,发现一个从节点的cpu使用800% 经过一些列排查,发现是被注入木马了, #被人种下的 ...
- ValueError: Unable to determine SOCKS version from socks://127.0.0.1:1080/
使用ss之后输入conda指令出现错误:“ValueError: Unable to determine SOCKS version from socks://127.0.0.1:1080/”. 解决 ...
- Redis Cluster Cache with SpringBoot
前提: 根据 https://www.cnblogs.com/luffystory/p/12081074.html 创建好Redis集群 <project xmlns="http:/ ...
- ruby_类的调用及require的使用
在文件arrayTest_1中,定义class Liuyang内容如下:(通过require File.expand_path('../arrayTest_2',__FILE__) 来包含其他文件的文 ...