T3】细胞分裂

【算法】数论

【题解】均分的本质是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>
//https://www.cnblogs.com/onioncyc/p/5766587.html
//其实是一个数论的题目,质因数分解
using namespace std;
const int maxm=30010,maxn=10010,inf=0x3f3f3f3f,eps=1e-6;
int pri[maxm],num[maxm],num2[maxm],s[maxn],tot=0,n,m,m2,ans;
int main(){
scanf("%d %d %d",&n,&m,&m2);
/*
将m1分解质因数,即m1=p1^a1*p2^a2*...*pk^ak
所以M=m1^m2=p1^(a1*m2)*p2^(a2*m2)*...*pk^(ak*m2)
*/
for(int i=2;i*i<=m;i++){
if(m%i==0){
pri[++tot]=i;
while(m%i==0){
m/=i;
num[tot]++;
}
}
}
if(m!=1) {
pri[++tot]=m;num[tot]=1;
}
for(int i=1;i<=tot;i++) num[i]*=m2;
ans=inf;
/*
如果s[i](细胞初始个数)不能被M分解出来的质因数(即p1,p2...pn)中的某一个整除的话,这种细胞就永远不可能装入M个瓶子中 换句话说,如果s[i]分解出来的质因数不能包含M的所有质因数的话,就永远不能整除M(即使乘方(分裂)后)。 当然并不需要真的把s[i]分解为质因数,只要有一个s[i]%pj(j=1..k)!=0就说明是-1。
*/
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
bool f=0;
memset(num2,0,sizeof(num2));
for(int j=1;j<=tot;j++){
if(s[i]%pri[j]!=0) f=1;
}
if(f) continue;
/*
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就是答案。
*/
for(int j=1;j<=tot;j++){
while(s[i]%pri[j]==0){
num2[j]++;
s[i]/=pri[j]; //s[i]中包含pi的个数
}
}
int maxs=0;
for(int j=1;j<=tot;j++){
if(num[j]>num2[j]){
//num[j]是a[i]*m2 num2[j]是b[i]
maxs=max(maxs,(int)(ceil(1.0*num[j]/num2[j])+eps));
}
}
ans=min(ans,maxs);
}
if(ans==inf) ans=-1;
printf("%d",ans);
return 0;
}

  

T4】道路游戏

听起来比较复杂

但是看得出来数据范围不太大,可以试一试暴力,用二维数组存

其实有点像dp,用f[i]表示i这个时刻能够得到的最大值

最外层枚举时间,第二次枚举结尾的地方,第三层枚举走过的时间,就自然得出了出发的地方,在出发的地方买就能得到一个比较的值

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn=1010;
const int INF=0x3fffffff;
int cost[maxn];
int value[maxn][maxn]; //地点对应时间出现的价值
int f[maxn]; //状态压缩至一维的,表示时间i能够取得的最大值,枚举到达结尾和走过的距离k,然后找到最大值
int n,m,p;
int main(){
scanf("%d %d %d",&n,&m,&p);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) scanf("%d",&value[i][j]);
}
for(int i=1;i<=n;i++) scanf("%d",&cost[i]);
memset(f,0x9f,sizeof(f));
f[0]=0;
for(int i=1;i<=m;i++){ //时间
for(int j=1;j<=n;j++){ //结尾的地点
int summ=0; //直接增加枚举从j走到d的值,不用数组存,也不用数组计算,不然太麻烦
for(int k=1;k<=p&&k<=i;k++){
int d=j-k;
if(d<=0) d=d%n+n;
summ+=value[d][i-k+1];
f[i]=max(f[i],f[i-k]+summ-cost[d]); //从d买,然后走k
}
}
}
printf("%d\n",f[m]);
return 0;
}

  

NOIP2009普及组的更多相关文章

  1. NOIP2009普及组细胞分裂(数论)——yhx

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

  2. [NOIP2009] 普及组

    多项式输出 模拟 /*by SilverN*/ #include<algorithm> #include<iostream> #include<cstring> # ...

  3. [NOIp2009普及组]细胞分裂

    思路: 首先将$30000$以内的所有质数求出,再对$m1$质因数分解. 对于每个$s$,计算它和$m1$的每个公共质因数的倍数关系,取$max$则为该细胞满足条件所花费的最少时间. 再对于每个细胞的 ...

  4. 洛谷 1067 NOIP2009 普及组 多项式输出

    [题解] 一道简单的模拟题.需要判一些特殊情况:第一项的正号不用输出,x的一次项不用输出指数,系数为0的项不用输出等等,稍微细心一下就好. #include<cstdio> #includ ...

  5. noip2017普及组

    过了这么久才来写博客,也是我这么一段时间都很低迷吧.... 老实来说,今年应该是要打提高组的...可还是打了普及组... 其实最猥琐的还是我连普及都写挂了,作为一个学了两年的人,图论,进阶dp都写过的 ...

  6. NOIP2002-2017普及组题解

    虽然普及组一般都是暴力省一,但是有一些题目还是挺难的qwq个人觉得能进TG的题目会在前面打上'*' NOIP2002(clear) #include<bits/stdc++.h> usin ...

  7. noip2017爆炸记——题解&总结&反省(普及组+提高组)

    相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...

  8. NOIP2012 普及组 T3 摆花——S.B.S.

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  9. NOIP2016普及组复赛解题报告

    提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:h ...

  10. 05:统计单词数【NOIP2011复赛普及组第二题】

    05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...

随机推荐

  1. xd p4 WEB源码拓展

    WEB 源码在安全测试中是非常重要的信息来源,可以用来代码审计漏洞也可以用来做信息突破口,其中 WEB 源码有很多技术需要简明分析. 知识点 关于 WEB 源码目录结构 后台目录.模板目录.数据库目录 ...

  2. 淘淘商城项目技术点-8:vsftpd

    FTP(文件传输协议)全称是:Very Secure FTP Server.   Vsftpd是linux类操作系统上运行的ftp服务器软件. vsftp提供三种登陆方式:1.匿名登录  2.本地用户 ...

  3. pgsql查询结果生成序列

    一.row_number生成序列 select (row_number() over()) as id from generate_series(1,100) 二.根据指定列排序 select (ro ...

  4. Python 集合常用方法

    数据类型:int/str/bool/list/dict/tuple/float/set   (set类型天生去重) 一.集合的定义 s = set()  #定义空集合 s = {'a','b','c' ...

  5. 暑假学习五 8.28日 hdfs

    文件系统 文件系统:存储和组织数据的方式,实现了数据的存储,分级组织,访问和获取,使用树状结构 数据:数据本身.文件系统元数据:文件大小,最后修改时间....描述性的数据 分布式文件系统 核心属性: ...

  6. Unity 热更新XLua

    什么是冷更新 开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性能 测试.测试成功后,用户即可在AppStore看到应用的更新信息,用户点击应用更 新后,需要先关闭应用,再进行更新 ...

  7. 怎么在Windows系统中制作Mac系统U盘启动盘?

    想要在Windows系统的电脑中制作Mac系统的U盘启动盘 操作方法: 请预先安装好TransMac并输入注册码) 插入U盘或其它存储介质: 以管理员身份运行TransMac: 在左侧的设备列表中右键 ...

  8. shell_Day01

    1.判断/etc/inittab文件是否大于100行,如果大于,则显示"/etc/inittab is a big file."否者显示"/etc/inittab is ...

  9. oracle中查询表字段信息及主键字段

    select a.owner, a.table_name, a.column_name, a.data_type, d.constraint_type, a.num_nulls from all_ta ...

  10. 训练题——ADC读取温度

    Author:XuanYu 利用ADC测量单片机内部温度 废话不多说,直接开搞. 科普 先科普一下ADC(不是 AD carry!),ADC是模数转化器,就是模拟信号转换成数字信号的东西,通常的模数转 ...