记录一下题解里写的算法四

题目描述

$1 \le T \le 10^4,1\le m\le 100,0\le a_i\le 10^{18}$.


题目分析

题解里的算法四是这么写的

主要是这个$\alpha_i = \sum_{k = 1}^{\infty}{\left \lfloor \frac{N}{\mathrm{pr}_i^k} \right \rfloor}$的计算在蛮多地方有看到应用,所以这里记一下对算法四的理解。

题目给了$m$个$e_i$的限制,要求满足$\alpha_i \ge e_i$.首先由于这$m$个限制之间互相并不影响,所以答案$N=\max\{N_i\}$,其中$N_i$表示最小的满足第$i$个限制的数。这样只需要来考虑如下问题:

给定$\alpha,e,质数p$,求最小的$N$满足$\sum_{k = 1}^{\infty}{\left \lfloor \frac{N}{\mathrm{p}^k} \right \rfloor}=e$.

比较常见的套路是把$N$按$p$进制拆分成$(x_1 x_2 \cdots x_m)_{p}$。接下去考虑一个从右往左第$k+1$位$v \cdot \mathrm{p}^k$对$e$的贡献,由于它会在$k=1\cdots \mathrm{p}^k$时被计入,所以是$(v v \cdots v)_{\mathrm{p}}$(k个v).注意到这相当于是一个类似进制拆分的过程,那么就可以从高位到低位贪心地计算$N_i$。

 #include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull; int T;
bool vis[];
ll m,pr[],ans; ll read()
{
char ch = getchar();
ll num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void makePrime()
{
for (int i=; i<=; i++)
{
if (!vis[i]) pr[++pr[]] = i;
if (pr[]==) break;
for (int j=; j*i<=; j++)
vis[i*j] = true;
}
}
void write(ll x){if (x/) write(x/);putchar(x%+'');}
int main()
{
makePrime();
for (T=read(); T; --T)
{
m = read(), ans = ;
for (int i=; i<=m; i++)
{
ll e = read(), cnt = , base = , val = pr[i], p = pr[i];
while (base*p+ <= e)
base = base*p+, val *= p;
for (; base; base/=p,val/=p)
cnt += val*(e/base), e -= base*(e/base);
ans = std::max(ans, cnt);
}
write(ans), putchar('\n');
}
return ;
}

END

最新文章

  1. MongoDB 2.6.2 发布
  2. sqlserver -- 学习笔记(八)体验charindex、stuff 和 for xml path在实际问题中的应用及几个问题的探讨
  3. JavaScript中原型和原型链
  4. jquery过滤器
  5. java中对象的序列化和反序列化
  6. Ruby on Rails Tutorial 第四章 Rails背后的Ruby 之 字符串
  7. Spark Streaming揭秘 Day11 Receiver Tracker的具体实现
  8. Android - 安装 windows 7 安装 Android SDK 的时候出现的问题!(Connection to https://dl-ssl.google.com refused)
  9. Markdown语法备忘
  10. Qt自定义sleep延时函数(巧妙的使用时间差,但这样似乎CPU满格,而不是沉睡)
  11. U盘检测软件:ChipGenius,MyDiskTest
  12. linux命令readlink
  13. Android 应用程序崩溃日志捕捉
  14. 步步为营-93-MVC+EF简单实例
  15. axios 中断请求
  16. 通过orderby关键字,LINQ可以实现升序和降序排序。LINQ还支持次要排序。
  17. hadoop 2.x HA(QJM)安装部署规划
  18. [LeetCode] 877. Stone Game == [LintCode] 396. Coins in a Line 3_hard tag: 区间Dynamic Programming, 博弈
  19. 2014华为机试西安地区A组试题
  20. PyCharm 配置远程python解释器和在本地修改服务器代码

热门文章

  1. WCF中事务处理
  2. ahk实现git图床自动预览以及转换markdown格式
  3. 线上Storm的worker,executor,task参数调优篇
  4. 《PC Assembly Language》读书笔记
  5. Java基础部分 2
  6. 关于Linux操作系统中的一些易忘记的命令与作用
  7. (六)Spring 中的 JdbcTemplate
  8. 利用神器BTrace 追踪线上 Spring Boot应用运行时信息
  9. Oracle练习(一)
  10. WEB监控系列第三篇:graphite指南