【算法】数论

【题解】均分的本质是A整除B,A整除B等价于A的质因数是B的子集

1.将m1分解质因数,即m1=p1^a1*p2^a2*...*pk^ak

所以M=m1^m2=p1^(a1*m2)*p2^(a2*m2)*...*pk^(ak*m2)

2.如果s[i](细胞初始个数)不能被M分解出来的质因数(即p1,p2...pn)中的某一个整除的话,这种细胞就永远不可能装入M个瓶子中

换句话说,如果s[i]分解出来的质因数不能包含M的所有质因数的话,就永远不能整除M(即使乘方(分裂)后)。

当然并不需要真的把s[i]分解为质因数,只要有一个s[i]%pj(j=1..k)!=0就说明是-1。

3.确定不是-1后,需要计算最小分裂时间。

当s[i]^ans中包含的每个pi的个数(假设为bi)比M中包含的pi的个数(即ai*m2)多时,就能被M整除。

所以就是找到最小的ans,使每个bi>=(ai*m2)(i=1...n)。

这个ans=ceil(a[i]*m2/b[i]) (只适用于a[i]*m2比b[i]大时)(ceil表示向上取整)

在所有s[i]中寻找最小的ans就是答案。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cctype>
using namespace std;
const int maxm=,maxn=,inf=0x3f3f3f3f,eps=1e-;
int pri[maxm],num[maxm],num2[maxm],s[maxn],tot=,n,m,m2,ans;
int main()
{
// freopen("cell.in","r",stdin);
// freopen("cell.out","w",stdout);
scanf("%d",&n); scanf("%d%d",&m,&m2);
for(int i=;i*i<=m;i++)
if(m%i==)
{
pri[++tot]=i;
while(m%i==)m/=i,num[tot]++;
}
if(m!=)pri[++tot]=m,num[tot]=;
for(int i=;i<=tot;i++)num[i]*=m2;
ans=inf;//for(int i=1;i<=tot;i++)printf("[%d]%d %d\n",i,pri[i],num[i]);
for(int i=;i<=n;i++)
{
scanf("%d",&s[i]);
int f=;
memset(num2,,sizeof(num2));
for(int j=;j<=tot;j++)
if(s[i]%pri[j]!=)f=;
if(f)continue;
for(int j=;j<=tot;j++)
while(s[i]%pri[j]==)
num2[j]++,s[i]/=pri[j];
int maxs=;
for(int j=;j<=tot;j++)
if(num[j]>num2[j])//printf("[%d]num=%d,num2=%d\n",j,num[j],num2[j]),
maxs=max(maxs,(int)(ceil(1.0*num[j]/num2[j])+eps));
// printf("%d\n",maxs);
ans=min(ans,maxs);
}
if(ans==inf)ans=-;
printf("%d",ans);
return ;
}

【NOIP】普及组2009 细胞分裂的更多相关文章

  1. 2016.9.10初中部上午NOIP普及组比赛总结

    2016.9.10初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1340 好不爽!翻车了!不过排名差不多在中间偏上一点, 还好不是 ...

  2. 2016.8.17上午纪中初中部NOIP普及组比赛

    2016.8.17上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1335 本来觉得自己能考高分,但只得160分,并列第九.至少又挤 ...

  3. 2321. 【NOIP普及组T1】方程

    2321. [NOIP普及组T1]方程 时间限制: 1000 ms  空间限制: 262144 KB 题目描述

  4. [NOIP普及组2011]装箱问题

    目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 样例 输入 输出 前缀知识 题解 题目名称:装箱问题 来源:2011年NOIP普及组 链接 博客链接 CSDN 洛谷博客 题目链接 ...

  5. [NOIP普及组2001]最大公约数和最小公倍数问题

    目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 数据 样例 输入 输出 说明 题目名称:最大公约数和最小公倍数问题 来源:2001年NOIP普及组 链接 博客链接 CSDN 洛谷 ...

  6. 2016.8.15上午纪中初中部NOIP普及组比赛

    2016.8.15上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1333 这次比赛不怎么好,因为这套题目我并不是很擅长. 可同学们 ...

  7. 2016.9.15初中部上午NOIP普及组比赛总结

    2016.9.15初中部上午NOIP普及组比赛总结 2016.09.15[初中部 NOIP普及组 ]模拟赛 又翻车了!表示时超和空超很可恨! 进度 比赛:AC+0+0+20=120 改题:AC+80+ ...

  8. 2016.9.3初中部上午NOIP普及组比赛总结

    2016.9.3初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1339 这次真爽,拿了个第四!(我还被班主任叫过去1小时呢!) 进 ...

  9. 2016.8.19上午初中部NOIP普及组比赛总结

    2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ...

随机推荐

  1. lintcode-512-解码方法

    512-解码方法 有一个消息包含A-Z通过以下规则编码 'A' -> 1 'B' -> 2 ... 'Z' -> 26 现在给你一个加密过后的消息,问有几种解码的方式 样例 给你的消 ...

  2. 【leetcode】62.63 Unique Paths

    62. Unique Paths A robot is located at the top-left corner of a m x n grid (marked 'Start' in the di ...

  3. 程序员必看电影:Java 4-ever

    http://blog.csdn.net/zdwzzu2006/article/details/5863068

  4. 【php】提交的特殊字符会被自动转义

    在处理mysql和GET.POST的数据时,常常要对数据的引号进行转义操作. PHP中有三个设置可以实现自动对’(单引号),”(双引号),\\(反斜线)和 NULL 字符转移. PHP称之为魔术引号, ...

  5. Android Studio -导入项目 gradle处理

    如果导入 android studio 项目, 那么一定要注意 需要合适的gradle版本,具体方法为: 首先导入步骤: 打开android studio ==> File ==> New ...

  6. react-自定义事件

    没有嵌套关系的组件(如兄弟组件)之间的通信,只能通过自定义事件的方式来进行. var EventEmitter = require('events').EventEmitter; import Rea ...

  7. hadoop和spark搭建记录

    因玩票需要,使用三台搭建spark(192.168.1.10,192.168.1.11,192.168.1.12),又因spark构建在hadoop之上,那么就需要先搭建hadoop.历经一个两个下午 ...

  8. BZOJ 2039 人员雇佣(最小割)

    最小割的建图模式一般是,先算出总收益,然后再通过网络模型进行割边减去部分权值. 然后我们需要思考什么才能带来收益,什么才能有权值冲突. s连向选的点,t连向不选的点,那么收益的减少量应该就是将s集和t ...

  9. bzoj4798[CEOI2015] Calvinball championship

    这年头,n方跑1万的题已经不多了... 题意 bzoj4798 不知道怎么叙述这个题意... 分析 如果某个序列字典序小于给定的序列,我们不妨考虑从左到右第一个小于给定的序列的位置,并枚举这个位置的数 ...

  10. [十五]SpringBoot 之 启动加载数据

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...