UVA - 884 Factorial Factors

题目:

这个题目,我先开始尝试直接求出每个素因子的次数,然后全部加起来。

代码:

#include<iostream>
using namespace std;

int degree_in_fact(int m, int p)
{
	if (m)return degree_in_fact(m / p, p) + m / p;
	return 0;
}

bool isprime(int n)
{
	if (n == 2)return true;
	if (n % 2 == 0)return false;
	for (int i = 3; i*i <= n; i += 2)if (n%i == 0)return false;
	return true;
}
int main()
{
	int n;
	while (cin >> n)
	{
		int sum = 0;
		for (int i = 2; i <= n; i++)if (isprime(i))sum += degree_in_fact(n, i);
		cout << sum << endl;
	}
	return 0;
}

但是超时了,想必是因为测试用例比较多。

所以只好改成打表的方法。

代码:

#include<iostream>
using namespace std;

int sum[1000001];

bool isprime(int n)
{
	if (n == 2)return true;
	if (n % 2 == 0)return false;
	for (int i = 3; i*i <= n; i += 2)if (n%i == 0)return false;
	return true;
}

int main()
{
	for (int i = 0; i < 1000001; i++)sum[i] = 0;
	for (int i = 2; i < 1000001; i++)
	{
		if (isprime(i))
		{
			long long m = i;
			while (m < 1000001)
			{
				for (int j = m; j < 1000001; j += m)sum[j]++;
				m *= i;
			}
		}
	}
	for (int i = 1; i < 1000001; i++)sum[i] += sum[i - 1];
	int n;
	while (cin >> n)cout << sum[n] << endl;
	return 0;
}

这个打表的方法类似于筛法(其实本质上确实是一样的)

时间: 2024-11-02 00:11:48

UVA - 884 Factorial Factors的相关文章

中山大学校队内部选拔赛试题3.1【Factorial Factors】--------2015年2月9日

一:题目大意 当给定一个数时,先求出它的所有因子N1,N2······Nk,然后求出它的因子对应的因子的个数n1,n2·····nk,并求出最终结果S=n1^3+n2^3+n3^3+·····+nk^3. 二:题目分析 本题的数据范围是N<2^31.如果对于每一趟直接判断时间复杂度将会很高.因此我们需要做预处理,先求出在最大范围内所有的质数. 对于每一个质数p,它的因子只有1和p本身,那么S(p)=1+2^3=9. 对于数字x=p^k,我们可以得知它有1,p,,,,p^k这么多因子,那么S(x)

UVa 11621 - Small Factors

题目:找到不小于给定数n的,仅以2,3为因数组成的数字. 分析:数论,贪心,分治. 利用两根指针,分别代表乘2,与乘3的队列,队列为至今生成的数字,初始为{1}: 然后,每取两个指针对应元素*2和*3的值中最小的即为未找到的数字中最小的: 注意,可能生成重复数据,不要存进去(重复数据,一定连续产生). 说明:打表计算,二分查询输出即可. #include <iostream> #include <cstdlib> #include <cstdio> using name

UVA 160 - Factors and Factorials

 Factors and Factorials  The factorial of a number N (written N!) is defined as the product of all the integers from 1 to N. It is often defined recursively as follows: Factorials grow very rapidly--5! = 120, 10! = 3,628,800. One way of specifying su

UVA - 10856 Recover Factorial(二分查找)

题目:(Sample Output是错的!要不是因为题目里面有描述输出,估计没人做的对吧) 这个题目,和这个OJ里面的另外一个题目有着紧密的联系.点击打开我的博客 (这一点,其实从标题也看的出来) 把这个题目的代码改改就能得到这个题目的代码. 在编代码的过程中就已经用到了二分了,可以确定,需要的数组大小的大致范围,大于2700000,小与2750000 代码: #include<iostream> using namespace std; int sum[2750000]; bool ispr

UVA 1575 Factors

https://vjudge.net/problem/UVA-1575 题意: 令f(k)=n 表示 有n种方式,可以把正整数k表示成几个数的乘积的形式. 例 10=2*5=5*2,所以f(10)=2 给出n,求最小的k 搜索 从最小的质数开始枚举选几个 假设前i-1个种质数用了k个,有sum种方案,第i种质数选a个, 那么前i种质数的方案就有sum*C[k+a][a] 可以理解原来有k个位置,又加了a个位置,有a个数可以放在任意位置 所以前i种的每一种方案都变成C[k+a][a]种 枚举每个质

B - Factors of Factorial

Problem Statement You are given an integer N. Find the number of the positive divisors of N!, modulo 109+7. Constraints 1≤N≤103 Input The input is given from Standard Input in the following format: N Output Print the number of the positive divisors o

[数论]Factors of Factorial

题目描述 You are given an integer N. Find the number of the positive divisors of N!, modulo 109+7. Constraints1≤N≤103 输入 The input is given from Standard Input in the following format:N 输出 Print the number of the positive divisors of N!, modulo 109+7. 样例

UVA - 10791 - Minimum Sum LCM (数论相关!)

题目链接:Minimum Sum LCM UVA - 10791 Minimum Sum LCM Time Limit:3000MS   Memory Limit:Unknown   64bit IO Format:%lld & %llu SubmitStatus Description  Minimum Sum LCM  LCM (Least Common Multiple) of a set of integers is defined as the minimum number, whic

uva 11610 Reverse Prime

Problem FReverse Prime Input: Standard Input Output: Standard Output There are a few 7 digit positive numbers whose reverse number is a prime number and less than 10^6.  For example: 1000070, 1000090 and 1000240 are first few reverse prime numbers be