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 input file consists of several test cases. The first line in the file is the number of cases to handle. The following lines are the cases each of which contains two integers
m (1<m<5000) and n (0<n<10000). The integers are separated by an space. There will be no invalid cases given and there are not more that
500 test cases.

Output

For each case in the input, print the case number and result in separate lines. The result is either an integer if
m divides n! or a line "Impossible to divide" (without the quotes). Check the sample input and output format.

Sample Input

2

2 10

2 100

Sample Output

Case 1:

8

Case 2:

97

题意:给你两个整数m和n,求最大的k使得m^k是n!的约数

思路:首先我们先将m分解质因数,那么m^k就是各个质因数*k而已,那么我们只要判断每个质因数的指数在n!的对应的质因数的指数范围内,求所有质因数最小的一个,至于

怎么求n!里某个质因数的个数,比如是2的话,那么只要计算n/2+n/4+n/8...的个数就行了,可以这么想没隔2个数就有一个2,然后是4...

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int inf = 0x3f3f3f3f;

int main() {
	int t, n, m, cas = 1;
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &m, &n);
		int i = 2;
		int ans = inf;
		while (m != 1) {
			int p = 0;
			while (m % i == 0) {
				m /= i;
				p++;
			}
			if (p) {
				int num = n;
				int tmp = 0;
				while (num) {
					tmp += num/i;
					num /= i;
				}
				ans = min(ans, tmp/p);
			}
			i++;
		}
		printf("Case %d:\n", cas++);
		if (ans)
			printf("%d\n", ans);
		else printf("Impossible to divide\n");
	}
	return 0;
}

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

时间: 2024-11-07 12:29:51

UVA - 10780 Again Prime? No Time. (质因子分解)的相关文章

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.(唯一分解)

输入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

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代码

hdoj 1492 The number of divisors(约数) about Humble Numbers 【数论】【质因子分解 求和】

定理:一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其中 pi 为素数) , 那么这个数的因子的个数就是,(r1+1)*(r2+1)*...*(rk+1). 理解:为什么是加1之后再相乘,因为一个数的的因子数至少为1和他自身,但因为r1,r2..可以为0,所以因子的个数为(r1+1)... 拓展一下: 定理1: 一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其中 pi 为素数) , 那么这个数的因子的

HDU 2601 An easy problem(暴力枚举/质因子分解)

An easy problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7963    Accepted Submission(s): 1920 Problem Description When Teddy was a child , he was always thinking about some simple math p

数学问题——质因子分解

所谓质因子分解是指将一个正整数 n 写成一个或多个质数的乘积形式,例如 24=2*2*2*3.显然,由于最后都要归结到若干不同质数的乘积,不妨先把素数表打印出来. 由于每个质因子都可以不止出现一次,因此不妨定义结构体 factor ,用来存放质因子及其个数,如下所示: 1 struct factor { 2 int x, cnt; // x 为质因子,cnt 为其个数 3 } fac[10]; 而有一个结论:对一个正整数 n 来说,如果它存在 [2,n] 范围内的质因子,要么这些质因子全部小于等

uva 1415 - Gauss Prime(高斯素数)

题目链接:uva 1415 - Gauss Prime 题目大意:给出一个a,b,表示高斯数a+bi(i=?2 ̄ ̄ ̄√,推断该数是否为高斯素数. 解题思路: a = 0 时.肯定不是高斯素数 a != 0时,推断a2+2b2是否为素数就可以. #include <cstdio> #include <cstring> #include <cmath> bool is_prime (int n) { int m = sqrt(n+0.5); for (int i = 2;

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)*.....