c-mu函数,我来水一水。比赛靠蒙,赛后分享猜蒙技巧。碰到数论题,不管会不会,打表看规律。
对每个n<20,k<20,打个表,大概是这样:
---------------n=1---------------
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1

---------------n=2---------------
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2

---------------n=3---------------
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1

---------------n=4---------------
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

---------------n=5---------------
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

---------------n=6---------------
7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6

---------------n=7---------------
6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7

---------------n=8---------------
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

---------------n=9---------------
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9

自己可以私下多打一点,由数据我们可以发现:对于每一个n,k达到一个数后,结果会在两个数之间循环(或者同一个数循环),这就好办了,对于输入的n,我们只求出前15个k,然后对输入的k判断奇偶,若为奇数,则输出k=10的值,若为偶数,则输出k=11的值。
怎么求mu函数?有模板就好了(划掉)。mu函数是数论入门吧,推荐学一学莫比乌斯反演就知道mu函数是啥了。
55555555555555~比赛的时候没开longlong哇了一发
代码:

#include<iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
const ll MOD = 1e9 + 7, inf = 0x3f3f3f3f;
inline ll read() {
    ll s = 0, w = 1;
    char ch = getchar();
    for (; !isdigit(ch); ch = getchar()) if (ch == '-') w = -1;
    for (; isdigit(ch); ch = getchar())    s = (s << 1) + (s << 3) + (ch ^ 48);
    return s * w;
}
enum {maxn=10000010};
#define int long long
long long phi[maxn], mu[maxn], vis[maxn], prime[maxn], prime_tot;
void get(int maxn) {
    phi[1] = mu[1] = 1;
    for (int i = 2; i <= maxn; i++)
    {
        if (!vis[i])
        {
            prime[++prime_tot] = i;
            mu[i] = -1; phi[i] = i - 1;
        }
        for (int j = 1; j <= prime_tot && prime[j] * i <= maxn; j++)
        {
            vis[i * prime[j]] = 1;
            if (i % prime[j] == 0)
            {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            else mu[i * prime[j]] = -mu[i], phi[i * prime[j]] = phi[i] * (prime[j] - 1);
        }
    }
}
long long f(int x) {
    return x + mu[x];
}
signed main() {
    get(10000005);
    int t=1,n,k;
    cin >> t;
    while (t--) {
        int a[20] = { 0, };
        cin >> n >> k;
        for (int i = 0; i < 14; ++i) {
            a[i] = f(n);
            n = f(n);
        }
        if (k < 14) cout << a[k-1] << endl;
        else {
            if (k & 1) cout << a[10]<<endl;
            else cout << a[11]<<endl;
        }
    }
}