#6303. 水题

内存限制 10 MiB 时间限制:1000 ms 标准输入输出

题目描述

给定正整数 n,kn, kn,k,已知非负整数 xxx 满足 n!modkx=0,求 xmaxx_{max}x​max​​ 。

输入格式

本题包含多组数据,请处理至文件末尾。

对于每组数据,共有一行,两个整数,表示 n,kn, kn,k。

输出格式

对于每组数据,输出一行,一个整数,表示 xmaxx_{max}x​max​​。

样例

输入样例

10 2
5000000000000000000 2
5000000000000000000 10000000000000

输出样例

8
4999999999999999981
96153846153846153

数据范围与提示

对于 40%40\%40% 的数据,k⩽2×107k \leqslant 2\times 10^7k⩽2×10​7​​,n⩽2×109n \leqslant 2\times 10^9n⩽2×10​9​​,数据组数 ⩽50 \leqslant 50⩽50。
对于 100%100\%100% 的数据,1<k⩽10131<k \leqslant 10^{13}1<k⩽10​13​​,1⩽n⩽5×10181 \leqslant n \leqslant 5\times 10^{18}1⩽n⩽5×10​18​​,数据组数 ⩽200\leqslant 200⩽200。

 

解题思路:

    由n!%kx=0可得:k^x必定是n!的一个约数,所以k中的质因数在$n!$肯定都存在,只是k中质因子的指数小于等于n!中的质因子的指数。

    假如我们现在已经知道了k的每个质因数及其指数:P1C1 P2C2... PmCm

    我们还知道n!的每个质因子及其指数:P1D1P2D2 ...PmDm

     那么可以得到:

      $C1*X_1<=D1$  $C_2*X_2<=D_2$ ... $C_m*X_m<=D_m$

     可以知道$$min{ X_1 X_2 ...X_m }$$便是满足条件的最大的X。

    现在将问题转换为求K和n!的质因数及其指数了。

    对于K的质因数和指数我们可以在$\sqrt{k}$的时间内求得,

而n!可以在$\log{n}*\sqrt{k}$的时间内得到。

#include<bits/stdc++.h>
using namespace std;
#define uint unsigned int
#define re register int
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 5000009
#define maxm
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ll)(ch-'');ch=getchar();}
return x*f;
}
bool v[maxn];
ll prime[maxn];
ll n,m,k,ans,tot,cnt; void Prime()
{
for(int i=;i<=;i++)
{
if(!v[i])
prime[++cnt]=i;
for(int j=;j<=cnt&&i*prime[j]<=;j++)
{
v[i*prime[j]]=;
if(i%prime[j]==)
break;
}
}
}
ll Cal(ll x,ll y)
{
if(x<y)
return ;
return Cal(x/y,y)+x/y;
}
int main()
{
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
Prime();
while(scanf("%lld%lld",&n,&k)!=EOF)
{
ll ans=9e18;
for(int i=;prime[i]*prime[i]<=k;i++)
{
if(k%prime[i]==)
{
cnt=;
while(k%prime[i]==)
++cnt,k/=prime[i];
ans=min(ans,Cal(n,prime[i])/cnt);
}
}
if(k!=)
ans=min(ans,Cal(n,k));
printf("%lld\n",ans);
}
fclose(stdin);
fclose(stdout);
return ;
}

LOJ #6303. 水题 (约数 质因数)的更多相关文章

  1. Atcoder 水题选做

    为什么是水题选做呢?因为我只会水题啊 ( 为什么是$Atcoder$呢?因为暑假学长来讲课的时候讲了三件事:不要用洛谷,不要用dev-c++,不要用单步调试.$bzoj$太难了,$Topcoder$整 ...

  2. 一道cf水题再加两道紫薯题的感悟

    . 遇到一个很大的数除以另一个数时,可以尝试把这个很大的数进行,素数因子分解. . 遇到多个数的乘积与另一个数的除法时,求是否能整除,可以先求每一个数与分母的最大公约数,最后若分母数字为1,则证明可整 ...

  3. 每日一刷(2018多校水题+2016icpc水题)

    11.9 线段树 http://acm.hdu.edu.cn/showproblem.php?pid=6315 求逆序对个数 http://acm.hdu.edu.cn/showproblem.php ...

  4. #82. 【UR #7】水题生成器

    链接:http://uoj.ac/problem/82 今天是世界水日,著名的水题资源专家蝈蝈大臣向世界宣布了他的一项新发明 —— 水题生成器. 每道题目都有一个正整数的难度值.水题生成器虽然强大但是 ...

  5. 【UOJ#82】【UR #7】水题生成器(贪心)

    [UOJ#82][UR #7]水题生成器(贪心) 题面 UOJ 题解 把\(n!\)的所有约数搜出来,这个个数不会很多. 然后从大往小能选则选就好了. #include<iostream> ...

  6. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  7. ACM :漫漫上学路 -DP -水题

    CSU 1772 漫漫上学路 Time Limit: 1000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  8. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  9. [poj2247] Humble Numbers (DP水题)

    DP 水题 Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The se ...

随机推荐

  1. 金融量化分析【day111】:Matplotib简介

    一.Matplotib-绘图和可视化简介 Matplotib是一个强大的Python绘图和数据可视化的工具包 1.安装方法 pip install matplotlib 2.引用方法 import m ...

  2. ZooKeeper-API CURD

    ZooKeeper Java API pom.xml 依赖 <?xml version="1.0" encoding="UTF-8"?> <p ...

  3. MVCC 能解决幻读吗?

    MySQL通过MVCC(解决读写并发问题)和间隙锁(解决写写并发问题)来解决幻读 MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ). 未提交读(REA ...

  4. Beamer 跳到另外一页

    \documentclass[english]{beamer}\usepackage{babel} \begin{document} \begin{frame}\frametitle{the refe ...

  5. DIV浮动层被OCX控件遮蔽解决方案

    在开发中需要在网页中嵌入OCX控件,但是控件嵌入后,总是会出现在网页最顶层,页面中的浮动DIV总是不能正常显示,会被遮蔽掉,那么这里就需要特殊处理一下: OBJECT会遮蔽掉页面内容,但是IFRAME ...

  6. python跨网段遍历枚举IP地址(转)

    转载链接:https://blog.csdn.net/u013042248/article/details/53165508 0x01 代码思路: 利用二进制遍历: 1.将IP地址分割,每一块转换为8 ...

  7. 第十三章 部署Java应用程序

    打包 清单文件被命名为MANIFEST.MF,用于描述归档特征. 清单文件被分为多个节, 第一节被称为主节,作用于整个文件; 其他节则必须起始于Name的条目. 节之间空行分开. jar cfm JA ...

  8. Mac 桌面软件开发基础问答

    1> Mac OS X平台下的桌面软件是由什么编程语言处理 答: 由Objective-C, swift编程语言处理 2> Mac OS X平台下的桌面软件是由什么框架构建 答: 由Coc ...

  9. Jmeter性能测试之基础知识(一)

    1. 官网下载Jmeter: 点这里, 下载完成解压即可 2. 启动: 进入解压后的bin目录, Windows点击jmeter.bat, Linux执行jmeter 3. 添加线程组(user) : ...

  10. IDEA手动创建JFinal项目

    http://www.jfinal.com/share/674 https://www.oschina.net/question/265150_110300