题目描述

一个合数的真因数是指这个数不包括其本身的所有因数,例如6 的正因数有
1; 2; 3; 6,其中真因数有1; 2; 3。一个合数的最大真因数则是这个数的所有真因数中最大
的一个,例如6 的最大真因数为3。
给定正整数l 和r,请你求出l 和r 之间(包括l 和r)所有合数的最大真因数之和。

分析

就是叫你算∑i=l..r,i为合数  iminfactor(i)∑i=l..r,i为合数iminfactor(i)\sum_{i=l..r,i为合数}\ \ \frac{i}{minfactor(i)}
前80分很好拿,基本的筛法即可。
提一提7,8两档,由于我们筛的是合数,那么必定存在根号以内的质因子,我们用根号以内的质因子筛[l,r]的部分即可。
线筛是不可能优化的了,考虑枚举质数去筛的筛法,我们必须要枚举一个质数p的倍数px,是因为不知道px有没有更小的质因子,即被之前的质数筛过了。如果能够优化就好了。
先拆成[1..l-1]和[1..r]。
容斥是不可能容斥的了。分析一下,假如我们算[1..n]一个质数p能筛的倍数px,x必然是小于p的质数都没有筛掉的trunc(n/p)以内的数。那么所有x的和就是trunc(n/p)以内的没有被p筛过的数的和。
考虑一个类似洲阁筛的叫做min25筛的东西。
设f(i,j)表示[2..i]中,除去前j个质数的非自身的倍数,剩下的数的和。也就是说,质数也算在里面。设第j个质数为prime[j].
那么(f(n,j-1)-f(n,j))/prime[j],就是第j个质数筛的那些x的和。
考虑这个东西的性质,尝试快速算。
对于一个f(i,j)
如果prime[j]2>iprime[j]2>iprime[j]^2>i,很明显j可以-1,因为根本不会筛掉任何数。那么j不比i√i\sqrt i大。
否则,考虑第j个质数筛掉的x*prime[j],我们先把prime[j]除掉,那么x满足2≤x≤i/prime[j]2≤x≤i/prime[j]2≤x≤i/prime[j],且x的质因子不含前j-1个质数。那么x的和就是f(⌊iprime[j]⌋,j−1)−sum[j−1]f(⌊iprime[j]⌋,j−1)−sum[j−1]f(\lfloor\frac{i}{prime[j]}\rfloor ,j-1)-sum[j-1],其中sum[j-1]表示前j个质数的和。
那么有递推式f(i,j)=f(i,j−1)−prime[j]∗(f(⌊iprime[j]⌋,j−1)−sum[j−1])f(i,j)=f(i,j−1)−prime[j]∗(f(⌊iprime[j]⌋,j−1)−sum[j−1])f(i,j)=f(i,j-1)-prime[j]*(f(\lfloor\frac{i}{prime[j]}\rfloor ,j-1)-sum[j-1])
记忆化搜索求f(n,m),其中prime[m]为平方后比n小的最大质数,分析时间复杂度,发现i的取值都能够表示成⌊nx⌋⌊nx⌋\lfloor \frac{n}{x}\rfloor的形式,因为⌊nab⌋=⌊⌊na⌋b⌋⌊nab⌋=⌊⌊na⌋b⌋\lfloor \frac{n}{ab}\rfloor=\lfloor \frac{\lfloor \frac{n}{a}\rfloor}{b}\rfloor。那么状态数就是每个i的j的个数和。也就是∑i=1..n√ni√ln⌊ni⌋∑i=1..nniln⌊ni⌋\sum_{i=1..\sqrt n}\frac{\sqrt\frac{n}{i}}{ln{\lfloor \frac{n}{i}\rfloor}},O(n34logn)O(n34logn)O(\frac{n^{\frac{3}{4}}}{logn})左右。时间复杂度跟这个一样。而实际上,如果记忆化搜索,有的n/i是用不到的。但递推就要用到了。

由于状态数比较多,我们记忆化搜索会很慢,哈希存不下,map带log很慢,所以最好按j分层一层一层递推,具体的,把每个n/i分类,对于i<=sqrt(n)的i,我们按i为下标存编号,其余的按n/i为下标存编号,即像map一样记录映射,然后推即可。

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef double db;
#define fo(i,j,k) for(i=j;i<=k;i++)
#define fd(i,j,k) for(i=j;i>=k;i--)
#define cmax(a,b) (a=(a>b)?a:b)
#define cmin(a,b) (a=(a<b)?a:b)
const int N=2e5+5,M=205,mo=1e9+7;
ll pri[N],i,j,t,sn,sum[N],tmp,ret,n,df[N],val[N],tt,le,ri,v,siz,f[2][N],s,p;
bool pd[N];
ll ans,cnt,l,r,v1,v2,x,mnf[N];
void predo(ll n)
{
    fo(i,2,n)
    {        if (!pd[i])
        {            pri[++pri[0]]=i;
            sum[pri[0]]=pri[pri[0]]+sum[pri[0]-1];
        }
        fo(j,1,pri[0])
        {            if (pri[j]*i>n) break;
            t=pri[j]*i;
            pd[t]=1;
            if (i%pri[j]==0)
                break;
        }
    }
}
ll calc(ll x,ll y)
{
    tt=0;
    le=1;
    while (le<=x)
    {        v=x/le;
        ri=x/v;
        df[++tt]=1ll*v*(v+1)/2-1;
        if (v<sn) f[0][v]=tt;
        else f[1][le]=tt;
        val[tt]=v;
        le=ri+1;
    }
    siz=tt;
    fo(j,1,y)
    {        ri=1;
        while (!(val[tt]/pri[j]/pri[j])) tt--;
        fo(i,1,tt)
        {            v=val[i]/pri[j];
            if (v<sn) p=f[0][v];else p=f[1][n/v];
            tmp=df[p]-sum[j-1];
            if (val[i]==n)
                ret+=tmp;
            df[i]=df[i]-1ll*tmp*pri[j];
        }
    }
    return df[1];
}
ll calc(ll n)
{
    int j;
    ret=0;
    sn=trunc(sqrt(n));
    fo(j,1,pri[0]) if (pri[j]>sn) break;
    j--;
    calc(n,j);
    return ret;
}
int main()
{
    freopen("t1.in","r",stdin);
    //freopen("factor.out","w",stdout);
    predo(2e5);
    scanf("%lld %lld\n",&l,&r);
    printf("%lld\n",calc(n=r)-calc(n=(l-1)));
}

[JZOJ5594][min25筛]最大真因数相关推荐

  1. min_25 JZOJ5594 最大真因数

    Time Limits: 2000 ms Memory Limits: 524288 KB Detailed Limits Downloads Description 一个合数的真因数是指这个数不包括 ...

  2. #6682. 梦中的数论(Min25筛)

    #6682. 梦中的数论 推式子 ∑i=1n∑j=kn∑k=1n[(j∣i)∧((j+k)∣i)]显然有j+k>j,所以我们另j+k=k′,有j>k′,并且j,k′都是i的约数这就相当于在 ...

  3. 51nod 1847 奇怪的数学题(数论/min25筛/杜教筛/斯特林数)

    51nod 1847 奇怪的数学题 求解∑i=1n∑j=1nsgcd(i,j),sgcd\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j),sgcd∑i=1n​∑j=1n​sgcd(i ...

  4. 真因数之和编程matlab,真因数

    相亲数问题: 220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284 284的真因数之和为1+2+4+71+142=220 A的真因数之和为B,B的真因数之和为A,像A ...

  5. 洲阁筛/Min25筛

    1:完整的Min25筛学习方案 2:虽然不是但我也挂 3:网上捞了好久才捞到的纯递推写法Min25筛 终于看懂了..... 就是充分利用合数一定有小于等于n\sqrt nn​的质因子和积性函数的性质来 ...

  6. 基于线性筛的Pollard_rho 因数分解算法【例题】

    目录 题目 输入 输出 思路 参考文章 代码 题目 输入 2 1 2 1 1000000 输出 1 3626619 思路 算[1,1e6]区间里面每个数的质因子次方数的和.再简化一点,给你一个大数,将 ...

  7. [学习笔记]Min-25筛

    %%yyb %%zsy 一. 基本操作: 筛1~N中的素数个数.n=1e9 设F(M,j)表示,2~M的所有数中,满足以下条件之一的数的个数: ①x是质数 ②x最小质因子大于(注意是大于没有等号)$P ...

  8. 【学习笔记】Min25筛

    [定理简介] Min25Min25Min25筛是一种能够求解积性函数f(x)f(x)f(x)的前缀和∑i=1Nf(i)\sum_{i=1}^{N}f(i)∑i=1N​f(i)的筛法,其前提条件为∑i= ...

  9. Loj#6053-简单的函数【Min25筛】

    正题 题目链接:https://loj.ac/p/6053 题目大意 定义一个积性函数f(pc)=pxorcf(p^c)=p\ xor\ cf(pc)=p xor c,求∑i=1nf(i)\sum_{ ...

最新文章

  1. Scala:Enumeration
  2. pdf格式怎么转换成word格式
  3. 原始套接字与sniffer
  4. CF1592E Bored Bakry
  5. 当数据中台遇见云原生,智领云看到企业数据转型新方向
  6. 定时器new Timer().schedule()的使用
  7. html下拉刷新原理,微信小程序 下拉刷新及上拉加载原理解析
  8. 如何实现文件上传 - JavaWeb
  9. 32位与4G内存限制
  10. Klevgrand DAW Cassette for Mac(磁带模拟效果器插件)
  11. tomcat处理连接的详细过程
  12. Linux网络服务-LAMP之基于NFS+Fastcgi的LAMP搭建
  13. 用PASS软件完成多组率的样本量计算
  14. C语言printf输出格式总结
  15. 区块链是世界第九大奇迹,它在触动钱、信任和权力!
  16. 信度spss怎么做_Spss详细图文教程——问卷信度和效度检验步骤图解
  17. wps下一页 很好玩!wps中怎么插入欧姆符号
  18. Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、TLS组织运行维护Orderer服务
  19. 如何将 EXCEL 数据写入数据库
  20. 淘宝触屏版宝贝详情改造(一)

热门文章

  1. 1Flask使用2路由3模板
  2. NOIP2014P4 子矩阵 题解
  3. java小明摘苹果_Java实现 洛谷 P1487 陶陶摘苹果(升级版)
  4. 要闻君说:又一家云服务关停,原来是网易;MongoDB又爆泄露大新闻;Google 的中国版搜索引擎项目其实仍在继续...
  5. 计算机制作请柬,婚礼邀请函制作软件免费版
  6. 4种FPGA时钟分频 【附源码】:1.偶数分频;2.奇数分频(占空比50%);3.奇数分频(任意无占空比);4.小数分频;
  7. php使用Qrcode生成二维码
  8. 7-114 用if-else语句编程百分制成绩转换为五分制成绩
  9. 学渣的刷题之旅 leetcode刷题 35.搜索插入位置(暴力法、二分查找)
  10. 阿里2019社招内推!阿里云高级专家(P8)帮内推!投递简历邮箱看正文!