【bzoj2440】莫比乌斯

15 篇文章 0 订阅

题目:全然平方数为含有平方数因子的数,求第n个非全然平方数。 n <= 10^9.

容易想到先二分,再容斥原理(莫比乌斯)。

num = (mid / i) * mu[i].

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <ctime>
#define Rep(i, x, y) for (int i = x; i <= y; i ++)
#define RepE(i, x) for (int i = pos[x]; i; i = g[i].nex)
using namespace std;
typedef long long LL;
const int N = 100001;
const LL inf = 1LL << 33;
int n, T, pri[N], tot, u[N];
LL l, r, d[N];
bool c[N];
void Pre() {
	u[1] = 1;
	Rep(i, 2, N-1) {
		d[i] = (LL)i * i;
		if (!c[i]) pri[++ tot] = i, u[i] = -1;
		Rep(j, 1, tot) {
			int k = i * pri[j];
			if (k >= N) break ;
			c[k] = 1;
			if (i % pri[j]) u[k] = -u[i];
			else { u[k] = 0; break; }
		}
	}
}
int main()
{
	Pre();
	cin >> T;
	while (T --) {
		scanf ("%d", &n);
		l = 1, r = inf;
		while (l < r) {
			LL mid = (l+r+1) / 2, num = 0;
			for (LL i = 2; i*i <= mid; i ++) num += (mid/d[i]) * -u[i];
			if (mid - num >= n) r = mid - 1;
			else l = mid;
		}
		printf ("%lld\n", l+1);
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值