UVA 10780

Problem

给两个整数M,N,要求找到最小的正整数K,使得(M^k)可整除(N ! )。输出K,若不存在,输出不存在。

Limits

Time Limit(ms): 3000

Memory Limit(MB): No Limit

M: [2, 5000]

N: [1, 10000]

不超过500个case

Solution

分解素因数,将M表示成(Pi1^Ki1)*(Pi2^Ki2)*......*(Pin^Kin)
,再将 N ! 表示成 (Pj1^Kj1)*(Pj2^Kj2)*......*(Pjn^Kjn)
。其中P表示素数,K表示幂。枚举M的每一个素数P,设该素数的幂为K1,找到 N ! 分解形式中素数P的幂K2(若不存在则K2=0),那么answer=(K2/K1)min.(answer=0表示答案不存在)

More

需要打表。表一存储[1, 10000]中每个数的分解素因数形式,表二存储[1, 10000]中每个数的阶乘的分解素因数形式。

表一用素数打表、通过素数表分解素因数的方法即可求。但注意,最好用两个vector,一个存储(Pi1^Ki1)*(Pi2^Ki2)*......*(Pin^Kin)里的P(需保证单调递增),一个存储K,两个vector长度一样,并会发现长度不超过4或5。这里用了一个性质,10^9内每个数的所有素因数的种类数很小。

表二需要用到有序表合并,即将两个单调递增的表合并成一个单调递增的表,这个过程与“归并排序”的合并步骤是类似的。同样用两个vector存储,长度不会超过1230多。又用到一个性质,[1,10000]中只有1230多个素数。

有了两个表就可以处理Solution中的问题了。处理方法多样,可以先存储记录后O(1)查找K2,也可以用two-pointers的方法查找K2。

Complexity

Time Complexity: O(t*N)(均摊情况下t不大,极端情况为10^3级别)

Memory Complexity: O(1000*N)

Source

UVA 10780

Code

UVA 10780 From My Github

时间: 2024-08-11 03:24:00

UVA 10780的相关文章

uva 10780 Again Prime? No Time. 质因子乱搞

求最大的k   使得 m^k 能被n!整除 m^k就是让m的每个质因子个数增加了k倍,只要求得n!的质因子能让m增加多少倍就够了.当然这里要取增加倍数最少的. 木桶装水的量取决于最短的木板. 预处理2-n每个数的质因子情况,由于n有10000,前10000个素数有1000+个,所以维护前缀和不划算. case只有500 所以干脆每次都算一遍. #include<stdio.h> #include<string.h> #include<iostream> #include

uva 10780 Again Prime? No Time.

POINT : 质因子分解:(仅给题解) http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1721 题意:给你两个整数m和n,求最大的k使得m^k是n!的约数 思路:首先我们先将m分解质因数,那么m^k就是各个质因数*k而已,那么我们只要判断每个质因数的指数在n!的对应的质因数的指数范围内,求所有质因数最小的一

UVA - 10780 Again Prime? No Time. (质因子分解)

Description Again Prime? No time. Input: standard input Output: standard output Time Limit: 1 second The problem statement is very easy. Given a number n you have to determine the largest power of m, not necessarily prime, that divides n!. Input The

UVa 10780 - Again Prime? No Time.(唯一分解)

输入n.m,求最大k使(mk)%n=0.首先筛选出所有素数,然后求出所有n,唯一分解的结果.对于m进行分解,对于每一个在m中的素数p[i]的指数e[i],k=min(e[i]). #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=10010; int p[maxn],pnum,en[maxn][1250],em[maxn]; bool np

UVa 10780 (质因数分解) Again Prime? No Time.

求mk整除n!,求k的最大值. 现将m分解质因数,比如对于素数p1分解出来的指数为k1,那么n!中能分解出多少个p1出来呢? 考虑10!中2的个数c:1~10中有10/2个数是2的倍数,c += 5:1~10中有10/4个数是4的倍数,所以c += 2,其中有10/8 = 1个数是8的倍数,所以c += 1: 这样10!中就能分解出8个2 对于每个素数p,求出ci / ki的最小值就是答案. 1 #include <cstdio> 2 #include <cmath> 3 #inc

数论 UVA 10780

数论题目.有关内容:整数质因数分解,N的阶乘质因数分解,整除的判断. 这道题的题意是给你两个数n.m,要求你求出n!所能整除的m^k的最大值的k是多少. 由于数据范围:1<m<5000,1<n<10000.通过分析我们可知,当n在100 以上后n!早已超出了int甚至__int64的范围了.即使在int范围内,要算出n!和m^k然后依次遍历,这样会超时. 所以我们可以考虑将如果m能整除n!,那么m^k才会有可能整除n!.如果n!可以整除m,那么将m进行质因数分解后,所得的所有质因子

UVA数学入门训练Round1[6]

UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll

uva10780 质因子分解

UVA - 10780 Again Prime? No Time.(uva卡得一逼,所以还是把vj的链接贴一下把) 题意:给出n,m,使得m^k是n!的因子,求最大的k 思路:质因子分解,将m 和n!都分解为 p1^a1*p2^a2*...pn^an,其中p1 p2...pn是连续的质数2,3,5,7...,用一个数组记录每个质数的次幂ai,然后二分答案k,只有当m分解的质因子的次幂*k全部小于等于n!分解的质因子次幂,m^k才是n!的因子,比较坑的一点是,当k=0时是作为无解的情况的 AC代码

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d