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

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 ) = i = 1 k ( e i + 1 ) \phi(n) = \prod_{i = 1}^k(e_i + 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;
}

发布了219 篇原创文章 · 获赞 23 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Eternally831143/article/details/84949141
今日推荐