NOIP2009普及组
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普及组的更多相关文章
- NOIP2009普及组细胞分裂(数论)——yhx
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...
- [NOIP2009] 普及组
多项式输出 模拟 /*by SilverN*/ #include<algorithm> #include<iostream> #include<cstring> # ...
- [NOIp2009普及组]细胞分裂
思路: 首先将$30000$以内的所有质数求出,再对$m1$质因数分解. 对于每个$s$,计算它和$m1$的每个公共质因数的倍数关系,取$max$则为该细胞满足条件所花费的最少时间. 再对于每个细胞的 ...
- 洛谷 1067 NOIP2009 普及组 多项式输出
[题解] 一道简单的模拟题.需要判一些特殊情况:第一项的正号不用输出,x的一次项不用输出指数,系数为0的项不用输出等等,稍微细心一下就好. #include<cstdio> #includ ...
- noip2017普及组
过了这么久才来写博客,也是我这么一段时间都很低迷吧.... 老实来说,今年应该是要打提高组的...可还是打了普及组... 其实最猥琐的还是我连普及都写挂了,作为一个学了两年的人,图论,进阶dp都写过的 ...
- NOIP2002-2017普及组题解
虽然普及组一般都是暴力省一,但是有一些题目还是挺难的qwq个人觉得能进TG的题目会在前面打上'*' NOIP2002(clear) #include<bits/stdc++.h> usin ...
- noip2017爆炸记——题解&总结&反省(普及组+提高组)
相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...
- NOIP2012 普及组 T3 摆花——S.B.S.
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- NOIP2016普及组复赛解题报告
提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:h ...
- 05:统计单词数【NOIP2011复赛普及组第二题】
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...
随机推荐
- win10格式化U盘提示没有权限执行此操作
解决办法参考:http://www.tpbz008.cn/post/766.html 1.gpedit.msc 2.展开计算机配置,管理模板.展开系统.选中可移动存储访问 3.所有可移动存储类:拒绝所 ...
- 百题计划-2 codeforces1185D Extra Element 暴力
https://codeforces.com/contest/1185/problem/D 题意:给一个序列,移除一个数然后排序后使得序列成为等差数列,求移除的下标. 解法: 先排序,把所有差值扔到m ...
- 压缩打包,tar
压缩打包命令 创建压缩包 tar -zcvf /home/xxxx.tar.gz /xahot 解压 tar -zxvf xxx.tar.gz gzip xxxx 自动变为 xxx.gz
- 《Kubernetes零基础快速入门》PDF电子书赠阅
<Python 3.8从入门到精通(视频教学版)> <Kubernetes零基础快速入门> PDF电子书赠阅,个人学习使用,禁止任何形式的商用. https://pan.bai ...
- Unity UGUI --- Text组件预先获取文本的宽度和高度
转自:https://blog.csdn.net/u010180140/article/details/104049958 原作者是用lua写的.明白用什么接口就好,什么语言不重要. 给定文本内容给T ...
- httprunner运行遇到彻底解决安装包过程中的Requirement already satisfied:问题
deMacBook-Pro:bndcs yuansanmei$ python3 -m pip install httprunner==v4.3.0Requirement already satisfi ...
- 选择/插入/冒泡/快速排序之R语言实现
题目来自于<R语言的科学编程与仿真>第9章第7题. 选择排序法.这是一种最简单,但是效率最低的排序算法.算法步骤如下: 对于给定的一个向量x,令最初的未排序向量u等于x,并且最初的已排序向 ...
- Flutter 中的普通路由、普通路由传值、 命名路由、命名路由传值
一.Flutter 中的路由 Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push ...
- Python学习笔记调试之取得反向跟踪的字符串
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...
- Day 11 11.2 文件操作
文件操作 引言 到目前为止,我们做的一切操作,都是在内存里进行的,这样会有什么问题吗?如果一旦断电或发生意外关机了,那么你辛勤的工作成果将瞬间消失.是不是感觉事还挺大的呢?现在你是否感觉你的编程技巧还 ...