LightOJ 1341 - Aladdin and the Flying Carpet(算术基本定理唯一分解定理)

26 篇文章 0 订阅
5 篇文章 0 订阅

Aladdin and the Flying Carpet

题解:首先必须知道一个数 n = p 1 e 1 ⋅ p 2 e 2 ⋅ p 3 e 3 ⋅ . . . p k e k n = p_1^{e_1}\cdot p_2^{e_2}\cdot p_3^{e_3}\cdot ...p_k^{e_k} n=p1e1p2e2p3e3...pkek的因子个数 ϕ ( n ) = ∏ i = 1 k ( e i + 1 ) \phi(n) = \prod_{i = 1}^k(e_i + 1) ϕ(n)=i=1k(ei+1)。算出多少对,然后剩下的枚举一下有多少个不满足的即可。

代码

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int N = 1E6+100, M = N / log(N) + N / 10;
int prime[M], k;
bool vis[N];

void init()
{
	for(int i = 2; i < N; ++i) {
		if(vis[i] == 0) 
			prime[k++] = i;
		for(int j = 2; j * i < N; ++j) {
			if(vis[i * j] == 0) 
				vis[i * j] = 1;
		}
	}
}

LL count1(LL n)
{
	LL ans = 1;
	for(LL i = 0; i < k && prime[i]*prime[i] <= n; ++i) {
		LL cnt = 0;
		while(n % prime[i] == 0) {
			n /= prime[i];
			cnt++;
		}
		ans *= (cnt + 1);
	}
	if(n > 1) ans *= (1 + 1);

	return ans;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("input.in","r",stdin);
#endif
	init();
	int T, w = 1;
	LL a,b;
	cin >> T;
	while(T--) {
		cin >> a >> b;
		LL ret = count1(a) / 2;
		for(LL i = 1; i < b && b * b <= a; ++i) {
			if(a % i == 0) {
				ret--;
			}
		}
		if(b * b >= a) ret = 0;
		cout << "Case "<< w++ << ": " << ret << endl;
	}

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值