【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛

题目描述

给下N,M,K.求

输入

输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示。

输出

如题

样例输入

1 2
3 3

样例输出

20



题解

莫比乌斯反演+线性筛

$\sum\limits_{i=1}^n\sum\limits_{j=1}^m\gcd(i,j)^k\\=\sum\limits_{d=1}^{\min(n,m)}d^k\sum\limits_{i=1}^n\sum\limits_{j=1}^m[\gcd(i,j)=d]\\=\sum\limits_{d=1}^{\min(n,m)}d^k\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}[\gcd(i,j)=1]\\=\sum\limits_{d=1}^{\min(n,m)}d^k\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}\sum\limits_{t|gcd(i,j)}\mu(t)\\=\sum\limits_{d=1}^{\min(n,m)}d^k\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}\sum\limits_{t|i\&t|j}\mu(t)\\=\sum\limits_{d=1}^{\min(n,m)}d^k\sum\limits_{t=1}^{\lfloor\frac{\min(n,m)}d\rfloor}\mu(t)\lfloor\frac n{dt}\rfloor\lfloor\frac m{dt}\rfloor$

继续令$D=dt$,可以得到:

$\sum\limits_{d=1}^{\min(n,m)}d^k\sum\limits_{t=1}^{\lfloor\frac{\min(n,m)}d\rfloor}\mu(t)\lfloor\frac n{dt}\rfloor\lfloor\frac m{dt}\rfloor\\=\sum\limits_{D=1}^{\min(n,m)}\lfloor\frac nD\rfloor\lfloor\frac mD\rfloor\sum\limits_{d|D}d^k\mu(t)\\=\sum\limits_{D=1}^{\min(n,m)}\lfloor\frac nD\rfloor\lfloor\frac mD\rfloor f(D)\\(f(D)=\sum\limits_{d|D}d^k\mu(t))$

此时可以选择通过枚举倍数来预处理$f$数组,有个小优化:枚举时先枚举$t$,如果$\mu(t)=0$则不进行操作。这样预处理的时间复杂度为$O(n\ln n+n\log k)$,可以勉强通过本题。

然后我就被CQzhangyu大佬D了一顿= =

此时可以发现$f$是$id^k$与$\mu$的狄利克雷卷积,两个积性函数的狄利克雷卷积也是积性函数。于是可以快筛$f$函数。

当$i$为质数时,显然$f(i)=i^k-1$

考虑$i*p$(p是质数)的处理:

当$i\mod p\neq 0$时,显然$i$与$p$互质,就有$f(i*p)=f(i)*f(p)$

当$i\mod p=0$时,对$f(i*p)$有影响的$t$一定是与对$f(i)$有影响的$t$中,因为其余的因数都至少包含$p^2$,$\mu=0$。而此时$d$增加了$p$倍,故$f(i*p)=f(i)*p^k$。

综上可以线性筛出$f$函数,然后分块处理。时间复杂度为$O(n+\frac{n\log k}{\ln n}+T\sqrt(n))$

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 5000010
using namespace std;
typedef long long ll;
const int p = 5000000 , mod = 1000000007;
int prime[N] , tot;
ll d[N] , f[N] , sum[N];
bool np[N];
ll pow(ll x , ll y)
{
    ll ans = 1;
    while(y)
    {
        if(y & 1) ans = ans * x % mod;
        x = x * x % mod , y >>= 1;
    }
    return ans;
}
int main()
{
    int T , k , i , j , n , m;
    ll ans;
    scanf("%d%d" , &T , &k);
    f[1] = sum[1] = 1;
    for(i = 2 ; i <= p ; i ++ )
    {
        if(!np[i]) prime[++tot] = i , d[tot] = pow(i , k) , f[i] = (d[tot] - 1 + mod) % mod;
        for(j = 1 ; j <= tot && i * prime[j] <= p ; j ++ )
        {
            np[i * prime[j]] = 1;
            if(i % prime[j] == 0)
            {
                f[i * prime[j]] = f[i] * d[j] % mod;
                break;
            }
            else f[i * prime[j]] = f[i] * f[prime[j]] % mod;
        }
        sum[i] = (sum[i - 1] + f[i]) % mod;
    }
    while(T -- )
    {
        scanf("%d%d" , &n , &m) , ans = 0;
        for(i = 1 ; i <= n && i <= m ; i = j + 1)
            j = min(n / (n / i) , m / (m / i)) , ans = (ans + (ll)(n / i) * (m / i) % mod * (sum[j] - sum[i - 1] + mod)) % mod;
        printf("%lld\n" , ans);
    }
    return 0;
}
时间: 2024-08-06 20:03:53

【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛的相关文章

bzoj 4407 于神之怒加强版 (反演+线性筛)

于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 1184  Solved: 535[Submit][Status][Discuss] Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. Output 如题 Sample Input 1 2 3 3 Sample Output 20

【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛

题目描述 对于正整数x,定义f(x)为x所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数n,m,求$\sum\limits_{i=1}^n\sum\limits_{j=1}^mf(\gcd(i,j))$ 输入 第一行一个数T,表示询问数.接下来T行,每行两个数n,m,表示一个询问. 输出 对于每一个询问,输出一行一个非负整数作为回答. 样例输入 4 7558588 9653114 6514903 445121

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

BZOJ 2693: jzptab [莫比乌斯反演 线性筛]

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1194  Solved: 455[Submit][Status][Discuss] Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=1000000

hdu.5212.Code(莫比乌斯反演 &amp;&amp; 线性筛)

Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 300    Accepted Submission(s): 124 Problem Description WLD likes playing with codes.One day he is writing a function.Howerver,his computer b

【BZOJ2694】Lcm 莫比乌斯反演+线性筛

[BZOJ2694]Lcm Description 对于任意的>1的n gcd(a, b)不是n^2的倍数也就是说gcd(a, b)没有一个因子的次数>=2 Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 4 2 4 3 3 6 5 8 3 Sample Output 24 28 233 178 HINT HINTT <= 10000 N, M<=4000000 题解:一

BZOJ4407: 于神之怒加强版

4407: 于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 779  Solved: 368[Submit][Status][Discuss] Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. Output 如题 Sample Input 1 2 3 3 Sample Outp

[bzoj2440]完全平方数[中山市选2011][莫比乌斯函数][线性筛][二分答案]

题意:求第k个分解质因子后质因子次数均为一的数,即求第k个无平方因子数. 题解: 首先二分答案mid,那么现在就是要求出mid以内的无平方因子数的个数. 其次枚举$\sqrt{mid}$内的所有质数,由容斥原理 $Num=0个质数平方的倍数的数量(1的倍数)-1个质数平方的倍数的数量(9,25...的倍数)$ $+2个质数平方的倍数的数量(36,100...的倍数)...$ 可以发现对于一个数x,x的倍数数量对答案的贡献符号为$\mu(x)$. 例如:9的倍数数量最答案的贡献是$\mu(9)\l

bzoj 3309 DZY Loves Math——反演+线性筛

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然后 f( ) 还不能一个就花 log 的时间,所以要分析性质. 设 n 一共 m 个质因数,其中最大的指数是 t . 已有 Σ(d|n) f(d)*u(n/d) ,如果 u( ) 的部分含有指数>=2的质因子,就无贡献:所以 u( ) 里每种质因数选1个或0个,一共 2^m 种. 如果 n 里有一个