您的位置:首页 > 产品设计 > UI/UE

hdu 5297 Y sequence(容斥)

2015-07-31 22:15 267 查看
题目链接:hdu 5297 Y sequence

考虑62以内的指数,x为奇数个质数因子,就减掉,偶数个加上。计算x为指数的不满足数直接pow(n,1/x)即可。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;
typedef long long ll;
const int fac[30] = {-2, -3, -5, -7, -11, -13, -17, -19, -23, -29, -31, -37, -41, -43, -47, -53, -59, -61, -67};

ll N;
int R;
vector<int> S;

void init () {
S.clear();
scanf("%lld%d", &N, &R);

for (int i = 0; abs(fac[i]) <= R; i++) {
int tmp = S.size();
for (int j = 0; j < tmp; j++) {
if (abs(fac[i] * S[j]) <= 63)
S.push_back(fac[i] * S[j]);
}
S.push_back(fac[i]);
}
}

ll get(ll n) {
if (n == 1)
return 0;
ll ret = n;
for (int i = 0; i < S.size(); i++) {
ll tmp = (ll)(pow(n + 0.5, 1.0 / abs(S[i]))) - 1;
if (S[i] < 0)
ret -= tmp;
else
ret += tmp;
}
return ret - 1;
}

void solve () {
ll ret = N;
while (true) {
ll tmp = get(ret);
if (tmp == N)
break;
ret += N - tmp;
}
printf("%lld\n", ret);
}

int main () {
int cas;
scanf("%d", &cas);
for (int i = 1; i <= cas; i++) {
init();
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: