SP34096 【DIVCNTK - Counting Divisors (general)】

题目

\[\sum_{i=1}^n \sigma(i^k)\]

我们先来设一个函数\(f(i)=\sigma(i^k)\)

根据约数个数定理

\[f(p)=\sigma(p^k)=k+1\]

\[f(p^c)=\sigma(p^{ck})=ck+1\]

这不就可以Min_25筛了吗

还是先求出来一个区间内的质数个数,一个质数的贡献显然是\(k+1\),之后上板子就好了

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define maxn 3000005
#define re register
#define LL unsigned long long
int T,tot,f[maxn];
LL n,K,p[maxn],w[maxn],id1[maxn],id2[maxn],m,Sqr,g[maxn];
inline LL S(LL x,int y) {
    if(x<=1||p[y]>x) return 0;
    int t=(x<=Sqr)?id1[x]:id2[n/x];
    LL ans=g[t]*(K+1)-(K+1)*(y-1);
    for(re int k=y;k<=tot&&p[k]*p[k]<=x;k++) {
        LL p1=p[k];
        for(re int e=1;p1<=x;e++,p1*=p[k])
            ans+=(S(x/p1,k+1)+((e>1)?1:0))*(K*e+1);
    }
    return ans;
}
int main()
{
    scanf("%d",&T);f[1]=1;
    for(re int i=2;i<=100000;i++) {
        if(!f[i]) p[++tot]=i;
        for(re int j=1;j<=tot&&p[j]*i<=100000;j++) {
            f[p[j]*i]=1;if(i%p[j]==0) break;
        }
    }
    while(T--) {
        scanf("%llu%llu",&n,&K);Sqr=std::sqrt(n)+1;m=0;
        for(re LL l=1,r;l<=n;l=r+1) {
            r=n/(n/l);w[++m]=n/l;
            if(w[m]<=Sqr) id1[w[m]]=m;
                else id2[n/w[m]]=m;
            g[m]=w[m]-1;
        }
        for(re int j=1;j<=tot&&p[j]*p[j]<=n;j++)
            for(re int i=1;i<=m&&p[j]*p[j]<=w[i];i++) {
                int k=(w[i]/p[j]<=Sqr)?id1[w[i]/p[j]]:id2[n/(w[i]/p[j])];
                g[i]=g[i]-g[k]+j-1;
            }
        printf("%llu\n",S(n,1)+1);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/asuldb/p/10373074.html

时间: 2024-10-01 16:36:52

SP34096 【DIVCNTK - Counting Divisors (general)】的相关文章

SP34096 DIVCNTK - Counting Divisors (general) min_25筛

\(\color{#0066ff}{ 题目描述 }\) \(σ_0(i)\) 表示\(i\) 的约数个数 求\(S_k(n)=\sum_{i=1}^n\sigma_0(i^k)\mod 2^{64}\) \(\color{#0066ff}{输入格式}\) 第一行一个T为数据组数 接下来每组数据一个n,一个k \(\color{#0066ff}{输出格式}\) 每个询问输出一行 \(\color{#0066ff}{输入样例}\) 5 1 3 2 3 3 3 10 3 100 3 \(\color{

【DFS深搜初步】HDOJ-2952 Counting Sheep、NYOJ-27 水池数目

[题目链接:HDOJ-2952] Counting Sheep Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2476    Accepted Submission(s): 1621 Problem Description A while ago I had trouble sleeping. I used to lie awake,

hdu 6069 Counting Divisors(求因子的个数)

Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 3170    Accepted Submission(s): 1184 Problem Description In mathematics, the function d(n) denotes the number of divisors of

【机器学习算法-python实现】采样算法的简单实现

1.背景 采样算法是机器学习中比较常用,也比较容易实现的(出去分层采样).常用的采样算法有以下几种(来自百度知道): 一.单纯随机抽样(simple random sampling) 将调查总体全部观察单位编号,再用抽签法或随机数字表随机抽取部分观察单位组成样本. 优点:操作简单,均数.率及相应的标准误计算简单. 缺点:总体较大时,难以一一编号. 二.系统抽样(systematic sampling) 又称机械抽样.等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k

【OC语法快览】四、基础内存管理

Basic Memory Management                                                           基础内存管理 If you're writing an application for Mac OS X, you have the option to enable garbage collection. In general, this means that you don't have to think about memory

【机器学习算法-python实现】K-means无监督学习实现分类

1.背景 无监督学习的定义就不多说了,不懂得可以google.因为项目需要,需要进行无监督的分类学习. K-means里面的K指的是将数据分成的份数,基本上用的就是算距离的方法. 大致的思路就是给定一个矩阵,假设K的值是2,也就是分成两个部分,那么我们首先确定两个质心.一开始是找矩阵每一列的最大值max,最小值min,算出range=max-min,然后设质心就是min+range*random.之后在逐渐递归跟进,其实要想明白还是要跟一遍代码,自己每一步都输出一下看看跟自己想象的是否一样. (

【算法导论学习-014】计数排序(CountingSortTest)

参考:<算法导论>P194页 8.2节 Counting sort 1.Counting sort的条件 待排序数全部分布在0~k之间,且k是已知数:或者分布在min~max之间,等价于分布在0~max-min之间,max和min是已知数. 2.java 实现 /** * 创建时间:2014年8月17日 下午3:22:14 项目名称:Test * * @author Cao Yanfeng * @since JDK 1.6.0_21 类说明: 计数排序法,复杂度O(n), 条件:所有数分布在0

【OC语法快览】二、存取方法

Accessors 存取方法 All instance variables are private in Objective-C by default, so you should use accessors to get and set values in most cases. There are two syntaxes. This is the traditional 1.x syntax: OC中所有的实例变量默认是私有的,所以多数情况下你应该使用访问器来获得和设置实例变量的值.访问器

【深入理解Java虚拟机】垃圾回收机制

本文内容来源于<深入理解Java虚拟机>一书,非常推荐大家去看一下这本书. 本系列其他文章: [深入理解Java虚拟机]Java内存区域模型.对象创建过程.常见OOM 1.垃圾回收要解决的问题 垃圾收集(Garbage Collection,GC),要设计一个GC,需要考虑解决下面三件事情: (1)哪些内存需要回收? (2)什么时候回收? (3)如何回收? 哪些内存需要回收? 根据<Java内存区域模型.对象创建过程.常见OOM>中介绍的java内存模型,其中,程序计数器.虚拟机栈