题意

\(\sigma_0(i)\) 表示 \(i\) 的约数个数

\[S_k(n)=\sum_{i=1}^n\sigma_0(i^k)\pmod {2^{64}}
\]

共 \(T\) 组数据 \(T\le10^4,n,k\le10^{10}\)

题解

其实 SPOJ 上还有 divcnt2,divcnt3 ,三倍经验题2333

其实是 min_25 裸题 233

令 \(f(x) = \sigma_0(x^k)\) ,不难发现它是个积性函数,且单点求值较快。

前面 讲过了如何非递归在 \(\displaystyle O(\frac{n^{\frac{3}{4}}}{\ln n})\) 的时间里处理出所有素数的积性函数的前缀和。

现在终于来填合数的部分了 qwq

令 \(S(n, i)\) 为 \(\le n\) 的所有数 \(x\) 中,\(x\) 的最小质因子 \(\ge P_i\) 的 \(f(x)\) 之和。

接下来我们先算上所有满足条件的质数贡献之和,即 \(\displaystyle g(n,|P|) - \sum_{j = 1}^{i - 1}f(P_j)\) 。

对于合数,我们利用积性的性质,直接枚举其最小质因子以及质因子的个数,直接递归计算。

注意在这里形如 \(p^k,(p∈P)\) 的贡献并没有算进去,所以还要单独加一下。式子的形式如下:

\[S(n,i)=g(n,|P|)-\sum_{j=1}^{i-1}f(P_j)+\sum_{k\ge i}^{|P|}\sum_{e}(f(P_k^e)S(\lfloor\frac{n}{P_k^e}\rfloor,k+1)+f(P_{k}^{e+1}))
\]

最后我们需要求的就是 \(S(n, 1)\) 。因为第二维不能逐次除去,状态是不能很好确定的。所以对于非递归来说不太友好,我们递归计算。

如果当前的 \(n \le 1\) 或者 \(P_i > n\) 那么直接返回 \(0\) 退出。(注意 \(1\) 的贡献是最后单独算的)

然后这个直接计算的复杂度似乎也是 \(\displaystyle O(\frac{n^{\frac{3}{4}}}{\ln n})\) 的。(不会证。。)

最后要解决这题的话,只需要知道

对于 \(x\) 的唯一分解 \(x = \prod_{i} {p_i}^{{k_i}}\)

\[\sigma_0(x) = \prod_{i}(k_i + 1)
\]

所以就有 \(f(p) = k + 1, f(p^e) = ek + 1\) 。然后就能解决此题啦。

代码

#include <bits/stdc++.h>

#define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl using namespace std; typedef unsigned long long ll; template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; } inline ll read() {
ll x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
} void File() {
#ifdef zjp_shadow
freopen ("34096.in", "r", stdin);
freopen ("34096.out", "w", stdout);
#endif
} const int N = 1e5 + 1e3; int prime[N], pcnt; bitset<N> is_prime; void Linear_Sieve(int maxn) {
is_prime.set();
For (i, 2, maxn) {
if (is_prime[i]) prime[++ pcnt] = i;
for (int j = 1; j <= pcnt && 1ll * i * prime[j] <= maxn; ++ j) {
is_prime[i * prime[j]] = false; if (!(i % prime[j])) break;
}
}
} int id1[N], id2[N]; ll val[N * 2], res[N * 2], k, d, all; #define id(x) (x <= d ? id1[x] : id2[all / (x)]) void Min25_Sieve(ll n) {
d = sqrt(n); int cnt = 0;
for (ll i = 1; i <= n; i = n / (n / i) + 1)
val[id(n / i) = ++ cnt] = n / i, res[cnt] = val[cnt] - 1; for (int i = 1; i <= pcnt && 1ll * prime[i] * prime[i] <= n; ++ i)
for (int j = 1; j <= cnt && 1ll * prime[i] * prime[i] <= val[j]; ++ j)
res[j] -= res[id(val[j] / prime[i])] - (i - 1);
} ll S(ll n, int cur) {
if (n <= 1 || (ll)prime[cur] > n) return 0;
ll ans = (k + 1) * (res[id(n)] - (cur - 1));
for (int i = cur; i <= pcnt && 1ll * prime[i] * prime[i] <= n; ++ i) {
ll prod = prime[i];
for (int e = 1; prod * prime[i] <= n; ++ e, prod *= prime[i])
ans += (e * k + 1) * S(n / prod, i + 1) + ((e + 1) * k + 1);
}
return ans;
} int main () { File(); int cases = read(); Linear_Sieve(1e5); while (cases --) { ll n = read(); k = read(); all = n; Min25_Sieve(n); printf ("%llu\n", S(n, 1) + 1); } return 0; }

SPOJ divcntk(min25筛)的更多相关文章

  1. min25筛学习笔记

    min25筛简介:用来求积性函数F(x)前缀和的,复杂度O(n0.75/logn),大概能求n<=1010. 记一个数x的最小质因子为R(x),所以当x不为质数时,R(x)<=√x这是废话 ...

  2. LOJ# 572. 「LibreOJ Round #11」Misaka Network 与求和(min25筛,杜教筛,莫比乌斯反演)

    题意 求 \[ \sum_{i = 1}^{n} \sum_{i = 1}^{n} f(\gcd(i, j))^k \pmod {2^{32}} \] 其中 \(f(x)\) 为 \(x\) 的次大质 ...

  3. BZOJ-5244 最大真因数(min25筛)

    题意:一个数的真因数指不包括其本身的所有因数,给定L,R,求这个区间的所有数的最大真因数之和. 思路:min25筛可以求出所有最小因子为p的数的个数,有可以求出最小因子为p的所有数之和. 那么此题就是 ...

  4. loj#6235. 区间素数个数(min25筛)

    题意 题目链接 Sol min25筛的板子题,直接筛出\(g(N, \infty)\)即可 筛的时候有很多trick,比如只存\(\frac{N}{x}\)的值,第二维可以滚动数组滚动掉 #inclu ...

  5. 「学习笔记」Min25筛

    「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}​\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK ...

  6. [总结] min-25筛

    再不写总结我又会忘掉啊啊啊啊啊啊啊啊啊 这个\(min-25\)筛主要用来求一个积性函数的前缀和,就像这样\[\sum_{i=1}^n f(i)\] 不过这个积性函数要满足两个条件:质数\(p\)的函 ...

  7. min25筛学习总结

    前言 杜教筛学了,顺便把min25筛也学了吧= =刚好多校也有一道题需要补. 下面推荐几篇博客,我之后写一点自己的理解就是了. 传送门1 传送门2 传送门3 这几篇写得都还是挺好的,接下来我就写下自己 ...

  8. CodeForces - 83D:Numbers (数学&递归 - min25筛 )

    pro:给定三个整数L,R,P求[L,R]区间的整数有多少个是以P为最小因子的.L,R,P<2e9; sol: 一: 比较快的做法是,用函数的思想递归. 用solve(N,P)表示求1到N有多少 ...

  9. Min25筛

    Min25筛 我是沙雕... 从yyb博客蒯的 要求:\(\sum_{i=1}^nF(x)\) \(F(x)\)是积性函数. \(Min25\)筛能用的前提:质数处的\(f(p)\)值是关于\(p\) ...

  10. 莫比乌斯反演/线性筛/积性函数/杜教筛/min25筛 学习笔记

    最近重新系统地学了下这几个知识点,以前没发现他们的联系,这次总结一下. 莫比乌斯反演入门:https://blog.csdn.net/litble/article/details/72804050 线 ...

随机推荐

  1. Django之时间的设置

    Django之时间的设置 在Django的配置文件 settings.py 中,有两个配置参数是跟时间与时区有关的,分别是 TIME_ZONE 和 USE_TZ. 如果USE_TZ设置为True时,D ...

  2. MySQL经典编程问题

    星期数的问题 1 计算日期是周几 这个问题看似很简单,可以用MySQL内置函数来计算 (1) weekday(date)其返回值是0-6,0代表Monday, 6代表Sunday: (2) dayof ...

  3. Appscanner实验还原code1

    import _pickle as pickle from sklearn import svm, ensemble import random from sklearn.metrics import ...

  4. Django--CRM--QueryDict, 模糊搜索, 加行级锁

    一 . QueryDict的修改 # QueryDict正常是不允许修改的,要想往里面添加内容,需要另mutable=True dic = request.GET print(dic) # <Q ...

  5. Python魔法方法(magic method)细解几个常用魔法方法(下)

    接上文,再介绍最后几个常用的魔法方法. 关于__dict__: 先上个例子: class Test(object): fly = True def __init__(self, age): self. ...

  6. C# 中那些常用的工具类(Utility Class)(三)

    今天来接着写这个系列的文章,这一篇主要是用来介绍关于C#中的XML序列化的问题,这个相信大家一定会经常使用它,特别是在WPF中,有时候我们需要将我们后台的数据保存在数据库中,从而在软件下一次启动的时候 ...

  7. 解决mybatis generator警告Cannot obtain primary key information from the database, generated objects may be incomplete

    使用 mybatis generator 生成pojo.dao.mapper时 经常出现 Cannot obtain primary key information from the database ...

  8. mysql 允许特定IP访问

      1. 测试是否允许远程连接 $ telnet 192.168.1.8 3306 host 192.168.1.4 is not allowed to connect to this mysql s ...

  9. python RSA 加密与签名

    PyCrypto装起来就简单多了,我是直接 sudo easy_install pycrypto 直接搞定的 先生成rsa的公私钥:打开控制台,输入 openssl 再输入 genrsa -out p ...

  10. java 中的打印流

    package cn.zhou; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.F ...