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;
}
}
查看6道真题和解析