UVA 294 - Divisors (因子个数)

Description:

Mathematicians love all sorts of odd properties of numbers. For instance, they consider 945 945 945 to be an interesting number, since it is the first odd number for which the sum of its divisors is larger than the number itself.

To help them search for interesting numbers, you are to write a program that scans a range of numbers and determines the number that has the largest number of divisors in the range. Unfortunately, the size of the numbers, and the size of the range is such that a too simple-minded approach may take too much time to run. So make sure that your algorithm is clever enough to cope with the largest possible range in just a few seconds.

Input

The first l

The first line of input specifies the number N N N of ranges, and each of the N N N following lines contains a range, consisting of a lower bound Land an upper bound U U U, where L L L and U U U are included in the range. L L L and U U U are chosen such that 1 ≤ L ≤ U ≤ 1000000000 1 ≤ L ≤ U ≤ 1000000000 1LU1000000000 and 0 ≤ U − L ≤ 10000. 0 ≤ U − L ≤ 10000. 0UL10000.

Output

For each range, find the number P P P which has the largest number of divisors (if several numbers tie for first place, select the lowest), and the number of positive divisors D D D of P P P (where P P P is included as a divisor). Print the text ‘Between L L L and H , P H, P H,P has a maximum of Ddivisors.’, where L L L, H H H, P P P, and D D D are the numbers as defined above.

Sample Input

3
1 10
1000 1000
999999900 1000000000

Sample Output

Between 1 and 10, 6 has a maximum of 4 divisors.
Between 1000 and 1000, 1000 has a maximum of 16 divisors.
Between 999999900 and 1000000000, 999999924 has a maximum of 192 divisors

题意:

给你 l , r l,r l,r,让你找出 l , r l,r l,r之间因子最多的数是多少 b − a < = 1000 b-a<=1000 ba<=1000 我们枚举就好了。

AC代码:
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <stack>
#include <queue>
using namespace std;
#define sd(n) scanf("%d", &n)
#define sdd(n, m) scanf("%d%d", &n, &m)
#define sddd(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define pd(n) printf("%d\n", n)
#define pc(n) printf("%c", n)
#define pdd(n, m) printf("%d %d\n", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n, m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld", &n)
#define sldd(n, m) scanf("%lld%lld", &n, &m)
#define slddd(n, m, k) scanf("%lld%lld%lld", &n, &m, &k)
#define sf(n) scanf("%lf", &n)
#define sc(n) scanf("%c", &n)
#define sff(n, m) scanf("%lf%lf", &n, &m)
#define sfff(n, m, k) scanf("%lf%lf%lf", &n, &m, &k)
#define ss(str) scanf("%s", str)
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
#define mem(a, n) memset(a, n, sizeof(a))
#define debug(x) cout << #x << ": " << x << endl
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define mod(x) ((x) % MOD)
#define gcd(a, b) __gcd(a, b)
#define lowbit(x) (x & -x)
typedef pair<int, int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int MOD = 1e9 + 7;
const double eps = 1e-9;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const int inf = 0x3f3f3f3f;
inline int read()
{
	int ret = 0, sgn = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-')
			sgn = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9')
	{
		ret = ret * 10 + ch - '0';
		ch = getchar();
	}
	return ret * sgn;
}
inline void Out(int a) //Êä³öÍâ¹Ò
{
	if (a > 9)
		Out(a / 10);
	putchar(a % 10 + '0');
}

ll gcd(ll a, ll b)
{
	return b == 0 ? a : gcd(b, a % b);
}

ll lcm(ll a, ll b)
{
	return a * b / gcd(a, b);
}
///快速幂m^k%mod
ll qpow(ll a, ll b, ll mod)
{
	if (a >= mod)
		a = a % mod + mod;
	ll ans = 1;
	while (b)
	{
		if (b & 1)
		{
			ans = ans * a;
			if (ans >= mod)
				ans = ans % mod + mod;
		}
		a *= a;
		if (a >= mod)
			a = a % mod + mod;
		b >>= 1;
	}
	return ans;
}

// 快速幂求逆元
int Fermat(int a, int p) //费马求a关于b的逆元
{
	return qpow(a, p - 2, p);
}

///扩展欧几里得
int exgcd(int a, int b, int &x, int &y)
{
	if (b == 0)
	{
		x = 1;
		y = 0;
		return a;
	}
	int g = exgcd(b, a % b, x, y);
	int t = x;
	x = y;
	y = t - a / b * y;
	return g;
}

///使用ecgcd求a的逆元x
int mod_reverse(int a, int p)
{
	int d, x, y;
	d = exgcd(a, p, x, y);
	if (d == 1)
		return (x % p + p) % p;
	else
		return -1;
}

///中国剩余定理模板0
ll china(int a[], int b[], int n) //a[]为除数,b[]为余数
{
	int M = 1, y, x = 0;
	for (int i = 0; i < n; ++i) //算出它们累乘的结果
		M *= a[i];
	for (int i = 0; i < n; ++i)
	{
		int w = M / a[i];
		int tx = 0;
		int t = exgcd(w, a[i], tx, y); //计算逆元
		x = (x + w * (b[i] / t) * x) % M;
	}
	return (x + M) % M;
}

ll l, r;

ll solve(ll x)
{
	ll ans = 0;
	for (ll i = 1; i * i <= x; i++)
	{
		if (x % i == 0)
			ans++;
		if (x % i == 0 && x / i != i)
			ans++;
	}
	return ans;
}

int main()
{
	int t;
	sd(t);
	while (t--)
	{
		sldd(l, r);
		ll x, ans = 0;
		rep(i, l, r)
		{
			ll tmp = solve(i);
			if (tmp > ans)
			{
				ans = tmp;
				x = i;
			}
		}
		printf("Between %lld and %lld, %lld has a maximum of %lld divisors.\n", l, r, x, ans);
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值