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. 为什么要有jvm,jvm的作用?

    jvm的两个作用:第一.运行并管理java源码文件所生成的Class文件.第二.在不同的操作系统上安装不同的jvm,从而去实现跨平台的一个保障. 一般情况下,即使不熟悉jvm的运行机制,也不影响业务代 ...

  2. ubuntu iptables 做为路由转发

    实现功能,本地服务器的号段的192.168.8.0/24,而做为路由器的机器有2个ip,192.168.8.x和另一个ip,而另一个ip可以访问 192.168.2.0/24号段, 为了让其它192. ...

  3. 写于vue3.0发布前夕的helloworld

    前言: vue3.0马上要来了,于今昔写一篇vue将一个字符串hellowrold渲染于页面的过程,慰藉我这几个月写vue的'枯燥'. 源码版本是2.6.10. 开始: 我们的模板足够简单: < ...

  4. 高德地图poi关键字搜索-vue+ant-design

    最近有个需求,需要输入上车点,下车点,然后输入上车点的时候还要在下方显示地图附近的车辆.百度了一波之后,完全莫得头绪,很多代码也都用不了,即便改了之后也不怎么生效.我用的是jeecg-boot.最后静 ...

  5. select,poll和epoll使用场景和区别

    阻塞I/O至I/O多路复用 阻塞I/O指进程发起调用后会被挂起(阻塞),直到收到数据再返回.如果调用一直不返回,进程就一直被挂起.因此,使用阻塞I/O需要利用多线程来处理多个文件描述符. 引入非阻塞I ...

  6. mybatis -plus基础

  7. P1982 [NOIP2013 普及组] 小朋友的数字 题解

    目录 简单版 题目 code 本题 code 简单版 先要会做这道题 题目 P1115 最大子段和https://www.luogu.com.cn/problem/P1115 这道题其实是动态规划,d ...

  8. CF1786E题解

    容易为本题的弱化版CF1786C想出一个贪心: #include<bits/stdc++.h> using namespace std; #define int long long int ...

  9. Joseph Problem With Passwords In Java

    问题描述: 编号为1,2,......,n的n个人(每个人的信息有编号.姓名和密码三项)按照顺时针方向围坐一圈, 每个人有且只有一个密码(正整数,密码用随机方式赋值,范围1-15).一开始任选一个正整 ...

  10. oracle 数据库备份脚本(数据泵1-全库)

    #!/bin/sh# ################################################################### Powered by Ironfo# ## ...