zoukankan      html  css  js  c++  java
  • 题解 【BZOJ3309】DZY Loves Math

    问题

    传送门

    对于正整数 (n) ,定义 (f(n))(n) 所含质因子的最大幂指数

    即对于 (n=p_1^{c_1}p_2^{c_2}dots p_k^{c_k})(f(n)=max limits{c_i})

    [sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}f(gcd(i,j)) ]

    (n,mle 10^7)(tle 10^4) 组数据)

    解析

    直接按套路化简

    [egin{align*} &=sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}f(gcd(i,j))\ &=sumlimits_{k=1}^{n}sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[gcd(i,j)=k]f(k)\ &=sumlimits_{k=1}^{n}sumlimits_{i=1}^{lfloorfrac{n}{k} floor}sumlimits_{j=1}^{lfloorfrac{m}{k} floor}[gcd(i,j)=1]f(k)\ &=sumlimits_{k=1}^{n}sumlimits_{i=1}^{lfloorfrac{n}{k} floor}sumlimits_{j=1}^{lfloorfrac{m}{k} floor}sumlimits_{dmid n}mu(d)f(k)\ &=sumlimits_{k=1}^{n}sumlimits_{d=1}^{lfloorfrac{n}{k} floor}mu(d)f(k)sumlimits_{i=1}^{lfloorfrac{n}{k} floor}[dmid i]sumlimits_{j=1}^{lfloorfrac{m}{k} floor}[dmid j]\ &=sumlimits_{k=1}^{n}sumlimits_{d=1}^{lfloorfrac{n}{k} floor}mu(d)f(k)lfloorfrac{n}{dk} floorlfloorfrac{m}{dk} floor\&设 T=dk\&=sumlimits_{T=1}^nlfloorfrac{n}{T} floorlfloorfrac{m}{T} floorsumlimits_{dmid T}mu(d)f(frac{T}{d})\ end{align*}]

    现在我们只要预处理出 (g(n)=sumlimits_{dmid n}mu(d)f(frac{n}{d})) 的前缀和就可以了

    对于 (n,mle 10^7) 的数据来说,埃氏筛的时间复杂度过高,要使用线性筛

    可是 (g) 似乎并非积性函数,也无法使用卷积,无法快速求解,怎么办?

    观察 (g) ,发现 (mu)(f) 似乎都和质因数的指数有关,我们从此方向思考

    对于 (d=p_1^{dc_1}p_2^{dc_2}dots p_k^{dc_k}), 我们发现 (mu(d))(max limits{dc_i}ge 2) 的情况下值为 (0),不予考虑( (c) 前的 (d) 仅为标识符,无实际意义)

    因此对于 (dmid n) 来说,(dc_iin{0,1}),所以 (f(frac{n}{d})) 的取值只有可能是 (f(n))(f(n-1)) (因为 (frac{n}{d}) 最多只会除掉质因子的一次幂,所以说最大幂指数最多只会减一)

    现在我们又设 (frac{n}{d}=p_1^{frac{n}{d}c_1}p_2^{frac{n}{d}c_2}dots p_{n-k}^{frac{n}{d}c_{x}}dots p_n^{frac{n}{d}c_k}),且 (frac{n}{d}c_i (x+1le ile n)) 为最大幂指数,那么 (dc_i)(1le ile x) 的取值定然不会影响 (f(frac{n}{d})) 的取值

    我们发现,(dc_i)(1le ile x) 的取值一共有 (2^{x}) 种(每个位置只能取零和一),而 (mu(d)) 的取值为一和负一的情况(即质因子种类数量为奇数和偶数的情况)刚好相等,各有又因为前面的取值不影响 (f(frac{n}{d})) ,所以说最终取值一定会两两抵消, (g(n)=0)

    也就是说,若 (n) 的幂指数的取值不全部相等,(g(n)=0)

    (n) 的幂指数的取值全部相等,即 (n=p_1^{c}p_2^{c}dots p_k^{c}) ,则 (dc_i) 的取值一共有 (2^{k}) 种,而 (mu(d)) 的取值为一和负一的情况也相等,正常来讲 (g(n)) 的取值应该也是零,但是当 (dc_i=1(1le ile k)) 时,(f(frac{n}{d})) 的取值比其他的小,为 (f(n)-1) ,因此要减去此时 (mu(d)=mu(p_1^1p_2^1dots p_k^1)) 的值

    也就是说,若 (n) 的幂指数的取值全部相等,即 (n)等于某个正整数的次方, (g(n)=-mu(p_1p_2dots p_k))

    综上,若 (n=p_1^{c}p_2^{c}dots p_k^{c}) 时, (g(n)=-mu(p_1p_2dots p_k)),否则 (g(n)=0)

    这样,我们枚举 (i) ,令 (g(i^c)=-mu(i)) ,其他 (g(n)=0) 即可(注意特判 (n=1) 的情况)

    核心代码

    for(int i=2;i<=N;i++){
    	if(mu[i]=0)continue;
    	for(long long j=i;j<=N;j*=i){
    		g[j]=-mu[i];
    	}
    }
    
  • 相关阅读:
    Mongodb--基础(连接,增删改查,数据类型)
    [初识]使用百度AI接口,图灵机器人实现简单语音对话
    python--Websocket实现, 加密 sha1,base64
    Flask系列10-- Flask请求上下文源码分析
    python--partial偏函数
    Flask系列09--Flask中WTForms插件,及自定义验证器
    Flask系列08--Flask中flask_session, redis插件
    Flask系列07--Flask中的CBV, 蓝图的CBV
    Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler
    Flask系列05--Flask的配置config
  • 原文地址:https://www.cnblogs.com/ezlmr/p/15018412.html
Copyright © 2011-2022 走看看