细胞分裂

题目
分解质因数

超时的代码,每次每个数字循环的次数太大了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node {
	ll coe, exp;
}bucket[1005];
ll ans;
void Get(ll x, ll b) {
	ll i = 2, len = sqrt(x);
	ans = 0;
	while(x != 1 && i <= len) {
		if(x % i == 0) {
			ll cnt = 0;
			while(x % i == 0) {
				cnt++;
				x /= i;
			}
			bucket[ans++] = {i, cnt * b};
		}
		++i;
	}
	if(x != 1) bucket[ans++] = {x, b};
}
int main() {
	ll n;
	while(~scanf("%lld", &n)) {
		ll a, b, mi = LLONG_MAX;
		scanf("%lld %lld", &a, &b);
		Get(a, b);
		while(n--) {
			ll x;
			scanf("%lld", &x);
			ll len = sqrt(x);
			ll i = 2, f = 1, res = 0, j = 0;
			while(x != 1 && i <= len && j < ans) {
				if(x % i == 0) {
					ll cnt = 0;
					while(x % i == 0) {
						cnt++;
						x /= i;
					}
					if(bucket[j].coe == i) {
						res = max(res, (ll)ceil((0.0 + bucket[j].exp) / cnt));
						++j;
					}
				}
				++i;
			}
			if(x != 1 && bucket[j].coe == x) {
				res = max(res, bucket[j].exp);
				++j;
			}
			if(j >= ans) 
				mi = min(mi, res);
		}
		printf("%lld\n", mi == LLONG_MAX? -1 : mi);
	}
	return 0;
}

AC代码,把顺序颠倒一下就可以了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node {
	ll coe, exp;
}bucket[1005];
ll ans;
void Get(ll x, ll b) {
	ll i = 2, len = sqrt(x);
	ans = 0;
	while(x != 1 && i <= len) {
		if(x % i == 0) {
			ll cnt = 0;
			while(x % i == 0) {
				cnt++;
				x /= i;
			}
			bucket[ans++] = {i, cnt * b};
		}
		++i;
	}
	if(x != 1) bucket[ans++] = {x, b};
}
ll f(ll x, ll y) {
	int cnt = 0;
	while(x % y == 0)
		cnt++,x /= y;
	return cnt;
}
int main() {
	ll n;
	while(~scanf("%lld", &n)) {
		ll a, b, mi = LLONG_MAX;
		scanf("%lld %lld", &a, &b);
		Get(a, b);
		while(n--) {
			ll x;
			scanf("%lld", &x);
			ll i, res = 0;
			for(i = 0; i < ans; ++i) {
				if(x % bucket[i].coe == 0) {
					int cnt = f(x, bucket[i].coe);
					if(bucket[i].exp % cnt == 0) {
						res = max(res, bucket[i].exp / cnt);
					}
					else {
						res = max(res, bucket[i].exp / cnt + 1);
					}
				}
				else break;
			}
			if(i >= ans) 
				mi = min(mi, res);
		}
		printf("%lld\n", mi == LLONG_MAX? -1 : mi);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值