Mu函数

Mu函数

https://ac.nowcoder.com/acm/contest/7509/C

思路:
看到K这么大,我们知道这种题一般要先从找规律的角度尝试一下。
f(x)=x+Mu(x),那么跟据Mu(x),我们知道如果x的Mu(x)为0,不管经过多少次迭代,其结果都是0
如果Mu(x)不为0呢,通过对Mu(x)打表我们可以大胆猜测,在k很大的时候,要么x通过迭代到了Mu(x)=0的点,会产生-1,1的死循环。
代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 1e7+10;

int prime[MAXN], prime_tot;
bool prime_tag[MAXN];
int mu[MAXN];
void pre_calc(int lim) {
    mu[1] = 1;
    for(int i = 2; i <= lim; i++) {
        if(!prime_tag[i]) {
            prime[++prime_tot] = i;
            mu[i] = -1;
        }
        for(int j = 1; j <= prime_tot; j++) {
            if(i * prime[j] > lim) break;
            prime_tag[i * prime[j] ] = true;
            if(i % prime[j] == 0) {
                    mu[i * prime[j]] = 0;
                    break;
            } else {
                    mu[i * prime[j]] = -mu[i];
            }
        }
    }
}



signed main()
{
    pre_calc(MAXN);
    ios::sync_with_stdio(0);
    int T;
    cin >> T;
    while(T--)
    {
        int n, k;
        cin >> n >> k;
        int x = n;
        while(k){
            if(mu[x] == 0) break;
            if(mu[x] == -1 && mu[x-1] == 1){
                x-= (k&1ll); break;
            }
            x += mu[n];
            --k;
        }
        cout << x << endl;
    }
}
全部评论

相关推荐

有没有经济学家能告诉我,三年后中国的就业市场会不会好转?我在校招中拿到了一份9k+的offer,还是行业的龙头企业,心里其实不想再考研了。但又总是担心,万一读研后薪资更高,我会不会后悔呢?
Fyhyuky:三年后肯定不会啊,只会比现在更烂,你自己看看现在有没有什么增长点,电车都是国家补贴兜底才发展出来的,已经比较违背市场自然规律了,互联网更不用说了,国家强力打压,传统制造业转型失败,现在苟延残喘中
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务