【题解】BZOJ-4176 Lucas的数论
Description
-
给定整数 ,求
-
对于 的数据 。
Solution
中有两层整除分块。
用杜教筛,阈值为 。
预处理 的前缀和。
以 为阈值,当 时用 的公式,以预处理过的 的前缀和来计算;当 时用 中的整除分块计算。
那么预处理是 的。
第一层整除分块中,若 ,即 ,那么就会用 的前缀和 计算,这一段是 的。
第一层整除分块中,若 ,即 ,那么就会用整除分块来计算,一共是 ,即
也就是 的。
综上,总时间复杂度为 , 大约取 时最优,和杜教筛一样。
Code
// 18 = 9 + 9 = 18.
#include <iostream>
#include <cstdio>
#include <unordered_map>x
#define Debug(x) cout << #x << "=" << x << endl
typedef long long ll;
using namespace std;
const int MAXN = 1e6 + 5;
const int N = 1e6;
const int MOD = 1e9 + 7;
int p[MAXN], mu[MAXN], sum_mu[MAXN], d[MAXN], sum_d[MAXN], num[MAXN];
bool vis[MAXN];
void pre()
{
mu[1] = sum_mu[1] = d[1] = sum_d[1] = 1;
for (int i = 2; i <= N; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
mu[i] = -1;
d[i] = 2;
num[i] = 1;
}
for (int j = 1; j <= p[0] && i * p[j] <= N; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
mu[i * p[j]] = 0;
d[i * p[j]] = d[i] / (num[i] + 1) * (num[i] + 2);
num[i * p[j]] = num[i] + 1;
break;
}
mu[i * p[j]] = mu[i] * mu[p[j]];
d[i * p[j]] = d[i] * d[p[j]];
num[i * p[j]] = 1;
}
sum_mu[i] = sum_mu[i - 1] + mu[i];
sum_d[i] = (sum_d[i - 1] + d[i]) % MOD;
}
}
unordered_map<int, int> dp_mu;
int sublinear_mu(int n)
{
if (n <= N)
{
return sum_mu[n];
}
if (dp_mu.find(n) != dp_mu.end())
{
return dp_mu[n];
}
int res = 1;
for (int l = 2, r; l <= n; l = r + 1)
{
int k = n / l;
r = n / k;
res = (res - (ll)(r - l + 1) * sublinear_mu(k) % MOD + MOD) % MOD;
}
return dp_mu[n] = res;
}
int getsum_mu(int l, int r)
{
return (sublinear_mu(r) - sublinear_mu(l - 1) + MOD) % MOD;
}
int getsum_d(int n)
{
if (n <= N)
{
return sum_d[n];
}
int res = 0;
for (int l = 1, r; l <= n; l = r + 1)
{
int k = n / l;
r = n / k;
res = (res + (ll)(r - l + 1) * k % MOD) % MOD;
}
return res;
}
int block(int n)
{
int res = 0;
for (int l = 1, r; l <= n; l = r + 1)
{
int k = n / l;
r = n / k;
int tmp = getsum_d(k);
res = (res + (ll)getsum_mu(l, r) * tmp % MOD * tmp % MOD) % MOD;
}
return res;
}
int main()
{
pre();
int n;
scanf("%d", &n);
printf("%d\n", block(n));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通