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; } } }