习题10-9 约数 UVa294

1.题目描述:点击打开链接

2.解题思路:本题利用暴力搜索解决。因为题目中R-L最大不超过10000,可以直接进行搜索。并用ans,p分别标记目前找到的约数最多的个数以及对应的整数。因此关键问题是如何快速计算一个整数n的正约数的个数。

方法是这样的:可以从2开始尝试,如果n包含这个素数,那么就把它“除干净”,这样既可保证后面找到的因子均为素数,只需要枚举到sqrt(n)时即可停止。这样做的好处是不需要提前生成素数表即可得到n的唯一分解式。假设一共可以整除res次,那么累乘上res+1。注意最后如果n>1,说明最后n变为了一个素数,要再累乘上2。这样即可得到所有正约数的个数。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

#define N 1000000000+5
#define M 100000
typedef long long ll;

ll cal(int n)
{
	int tmp = n;
	int m = sqrt(n + 0.5);//枚举到sqrt(n)即可停止
	ll cnt = 1;
	for (int i = 2; i <= m;i++)
	if (n%i == 0){
		int res = 0;
		while (n%i == 0){//除干净
			n /= i; res++;
		}
		cnt *= (res + 1);
	}
	if (n > 1)cnt *= 2;//一定要有此判断
	return cnt;
}
int main()
{
	//freopen("t.txt", "r", stdin);
	int T;
	scanf("%d", &T);
	while (T--)
	{
		ll a, b;
		scanf("%lld%lld", &a, &b);
		ll ans = 0, p = a;
		for (ll i = a; i <= b; i++)
		{
			int res = cal(i);
			if (ans < res){
				ans = res;
				p = i;
			}
		}
		printf("Between %lld and %lld, %lld has a maximum of %lld divisors.\n", a, b, p, ans);
	}
}
时间: 2024-10-24 04:06:39

习题10-9 约数 UVa294的相关文章

D为10^k-1约数情形下的快速整除判定

[D为10^k-1约数情形下的快速整除判定] 例题一 例题二 例题三

C语言程序设计教程(第三版)课后习题10.4

1353: C语言程序设计教程(第三版)课后习题10.4 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 296  Solved: 219[Submit][Status][BBS] Description 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. Input 输入数据的个数n n个整数移动的位置m Output 移动后的n个数 Sample Input

问题 1047: C语言程序设计教程(第三版)课后习题10.5

/******************************************************************** @file Main.cpp @date 2017-06-01 12:17:46 @author Zoro_Tiger @brief 问题 1047: C语言程序设计教程(第三版)课后习题10.5 http://www.dotcpp.com/oj/problem1047.html ***************************************

问题 1043: C语言程序设计教程(第三版)课后习题10.1

/******************************************************************** @file Main.cpp @date 2017-05-29 12:55:07 @author Zoro_Tiger @brief 问题 1043: C语言程序设计教程(第三版)课后习题10.1 http://www.dotcpp.com/oj/problem1043.html ***************************************

第一章 课后习题 10

1 #include <iostream> 2 using namespace std; 3 int main() 4 { void sort(int x,int y,int z); 5 int x,y,z; 6 cin>>x>>y>>z; 7 sort(x,y,z); 8 return 0; 9 } 10 void sort(int x,int y,int z) 11 { 12 int temp; 13 if(x>y) {temp=x;x=y;y=t

1046: C语言程序设计教程(第三版)课后习题10.4

题目描述 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. 输入 输入数据的个数n n个整数 移动的位置m 输出 移动后的n个数 样例输入 10 1 2 3 4 5 6 7 8 9 10 2 样例输出 9 10 1 2 3 4 5 6 7 8 1 #include <stdio.h> 2 #define N 100 3 4 // 移动一次 5 move(int a[], int n) 6 { 7 int

APUE 第三版 习题 10.5

这是书本上的答案: See ''Implementing Software Timers'' by Don Libes (C Users Journal, vol. 8, no. 11, Nov. 1990) for an example. A copy of this paper is available online at http://www.kohala.com/start/libes.timers.txt. 我参考上面提到的文档,使用 alarm() 以及time() 简略测试了一下.

常见问题总结之习题10

斜杠  /   反斜杠 \ %r打印代码里的原始字符串,其中包含原始的转义字符.%r用户调试,%s用户显示. print 后每一行增加一个(,),这样print就不会输出换行符而结束这一行跑到下一行去了. input和raw_input区别:input会假设用户输入的是合法的python表达式/raw_input会把所有的输入当作原始数据,然后将其放入字符串中(). 原文地址:https://www.cnblogs.com/corewarsbin/p/10895681.html

最多约数问题

问题名称:最多约数问题. 问题描述:正整数x的约数是能整除x的正整数.正整数x的约数个数记为div(x).例如,1,2,5,10都是正整数10的约数,且div(10)=4.设a和b是2个正整数,a<=b,找出a和b之间约数个数最多的数x. 数据输入:输入数据由input.txt文件提供,第1行有2个正整数a和b(分开). 结果输出:程序运行结束时,若找到的a和b之间约数个数最多的数是x,将div(x)输出到output.txt中.