CF1471-B. Strange List
CF1471-B. Strange List
题意:
给定一个由\(n\)个数字组成的数组以及一个\(x\)。现在从前往后遍历数组,若当前遍历的数字\(a[i]\)可以被\(x\)整除,那么就在数组的最后加上\(x\)个数字\(\frac {a[i]}x\);若当前遍历的数字不能被\(x\)整除,那么就停止遍历。
问题是当遍历完这个数组之后,数组中所有数字的总和\(\sum_{i=1}^na[i]\)等于多少。
思路:
本题一开始是想通过模拟整个过程来计算结果的,当时很不幸在测试test5的时候MLE了,所以这题出题人本意肯定是让找出规律。
首先要想明白的明白的是,假设数字\(a[i]\)可以被\(x\)整除,那么整个数组所有数字的总和就会被加上\(\frac{a[i]}x * x\)也就是\(a[i]\)这么多;对于被加到数组后面的\(\frac{a[i]}x\),如果有一个\(\frac{a[i]}x\)可以被再次遍历到,那么其他所有的\(\frac{a[i]}x\)也都可以遍历到(原因很明显,他们是并排放进去的),若\(\frac{a[i]}x\)还可以被\(x\)整除,那么对于每个\(\frac{a[i]}x\)都会在数组最后加上\(x\)个\(\frac{\frac{a[i]}x}x\),那么一个\(x\)个\(\frac{a[i]}x\),所以数组所有数字总和一共加上了\(x*x*\frac{\frac{a[i]}x}x\)这么多,约分一下还是\(a[i]\)这么多。若继续下去会发现,每次都是加上了\(a[i]\)这么多。
现在假设这\(n\)个数字,每个数字能被\(x\)除的次数为\(b[i]\),那么在不考虑其他限制条件的情况下,每个数字能够对数组数字总和的额外贡献最多可以是\(a[i]*b[i]\)(根据上面的结论,一个数字被整除一次就可以多贡献\(a[i]\))。
但是实际上每个数字并不是都能贡献\(b[i]\)这么多次,原因在于:如果其中一个数字的\(b[i]\)太小了,比如特别极端的,\(b[i]=1\)的话,那么对于其他任何数字\(a[j]\)他们最多只能贡献两次,第一次是\(a[j]\)的时候,一次是\(\frac{a[j]}x\)的时候(这一次不一定能够遍历到,需要满足\(j<i\),这里的\(i\)是所有的最小的\(b[i]\)中最小的\(i\)),因为当数组遍历到\(\frac{a[i]}x\)的时候,这个数字不能再被\(x\)整除,数组的遍历就会结束,那么对于后面的数字虽然\(b[j]\)可能会很大,但是数组不能够遍历到那里了,也就不会再有贡献了。
所以要取得所有数字中\(b[i]\)的最小值,这里设最小值为\(b_{min}\),这里的\(min\)为出现最早的\(min\),即若\(b[i]\)的最小值为\(1\),有\(b[2]=1, b[3]=1\),那么就取\(min=2\),原因就是上面说到的,要求满足\(j<i\),\(i\)是所有的最小的\(b[i]\)中最小的\(i\)。
那么遍历完数组之后,整个数组数字之和\(Sum=\sum_{i=1}^{min-1}a[i]*(b[min]+1)+\sum_{i=min}^na[i]*b[min]+W\),其中\(W\)是在不遍历数组的时候,数组中所有数字的总和。
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int Maxn = 100005;
ll a[Maxn];
int b[Maxn];
void solve() {
memset(b, 0, sizeof b);
int n, minn = INF;
ll x, ans = 0;
scanf("%d %lld", &n, &x);
for (int i = 0; i < n; i++) {
scanf("%lld", a + i);
ans += a[i];
ll t = a[i];
while (t % x == 0) {
b[i]++;
t /= x;
}
minn = std::min(minn, b[i]);
}
bool flag = true;
for (int i = 0; i < n; i++) {
if (b[i] == 0) {
break;
}
if (b[i] == minn) {
flag = false;
}
if (flag) {
ans += (minn + 1) * a[i];
} else {
ans += minn * a[i];
}
}
printf("%lld\n", ans);
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}
CF1471-B. Strange List的更多相关文章
- timus 1175. Strange Sequence 解题报告
1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...
- CF719C. Efim and Strange Grade[DP]
C. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...
- HDU 1548 A strange lift (最短路/Dijkstra)
题目链接: 传送门 A strange lift Time Limit: 1000MS Memory Limit: 32768 K Description There is a strange ...
- ACM : HDU 2899 Strange fuction 解题报告 -二分、三分
Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- POJ 2891 Strange Way to Express Integers(拓展欧几里得)
Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...
- A strange lift_BFS
Problem Description There is a strange lift.The lift can stop can at every floor as you want, and th ...
- HDU 1548 A strange lift (bfs / 最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 A strange lift Time Limit: 2000/1000 MS (Java/Ot ...
- poj 2891 Strange Way to Express Integers (非互质的中国剩余定理)
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 9472 ...
- A strange lift
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- strange error encountered today in ROS
I reinstalled my ubuntu system and also ROS. I tested slam_karto package when some strange error cam ...
随机推荐
- vmstat参数详解
vmstat 5 可以使用ctrl+c停止vmstat,可以看到输出依赖于所用的操作系统,因此可能需要阅读一下手册来解读报告 第一行的值是显示子系统启动以来的平均值,第二行开始展示现在正在发生的情况, ...
- 【Linux】Centos7 安装redis最新稳定版及问题解决
------------------------------------------------------------------------------------------------- | ...
- apiAutoTest: 接口自动化测试的数据清洗(备份/恢复)处理方案
接口自动化测试之数据清洗/隔离/备份/恢复 在得到QQ:1301559180 得代码贡献之后,想到了通过ssh连接上服务器,然后进行数据库备份,数据库恢复, 主要使用了 paramiko库 最终效果 ...
- 关于postgresql中numeric和decimal的精度和标度问题
精度即数的有效数字个数 2.5的有效数字个数是2,但是053.2的有效数字个数是3 标度是小数点的位数 例如numeric(2,1),即这个数必须是两位,并且小数后面最多有一位,多出来的小数会被四舍五 ...
- C#使用struct直接转换下位机数据
编写上位机与下位机通信的时候,涉及到协议的转换,比较多会使用到二进制.传统的方法,是将数据整体获取到byte数组中,然后逐字节对数据进行解析.这样操作工作量比较大,对于较长数据段更容易计算位置出错. ...
- Linux内核分析_课程学习总结报告
请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的.自洽的,并举例某一两个具体例子(比如读写文件.分配内存.使用I/O ...
- drf认证、节流、权限、版本
Django rest framework 认证: 作用:验证用户是否登录 在视图类中写上authentication_classes = [ ],这是一个列表 需要实现 authenticate() ...
- 数字化转型中企业真正困惑-传统IT架构如何改造和全面上云
对数字化转型,整体来看大部分人相对关心问题主要还是集中在以下两个方面. 企业传统的IT架构如何如何微服务改造,演进发展 企业传统IT如何全面上云和实施云原生 以上两点实际都包括一个关键点,即企业当前内 ...
- 解决PHP无法监听9000端口问题/502错误解决办法
问题背景 配置nginx+php服务的时候,发现网站能打开html,打开php文件就显示502,一般这个是php没启动啊啥的导致不能正常解析php文件. 原因分析 因为nginx解析php文件是交给f ...
- IE双击打不开解决办法
方法1 [百度电脑专家]一键修复 建议下载并安装[百度电脑专家],官网:http://zhuanjia.baidu.com .打开[百度电脑专家],在搜索框内输入"IE修复",在搜 ...