HDU6266 - Hakase and Nano && 狄利克雷卷积

本文深入探讨了积性函数的概念,包括其定义与特性,如欧拉函数作为积性函数的实例。同时,文章解析了狄利克雷卷积的原理及其在数论函数组合中的应用,通过具体题目展示了如何利用积性函数和狄利克雷卷积解决复杂数学问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前置技能

积性函数

f(n) != 0 且 对于gcd(m, n) = 1

f(mn) = f(m)f(n)

则称该函数为积性函数

 

完全积性函数

对于任意的f(mn) = f(m)f(n) , 则 f(n)为完全积性函数 

 

欧拉函数

欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1) 

φ(p) = p-1

φ(p^k) = p^k * (1 - 1/p)    k >= 1

欧拉函数是一个积性函数

狄利克雷卷积

设 f(n), g(n) 是两个数论函数,

h(n)\quad =\quad \sum _{ d|n }^{ }{ f(d)g(\frac { n }{ d } ) }

称其为 f(n) 与 g(n) 的狄利克雷卷积, 我们用 f(n) ∗ g(n) 表示.

 

如果f(n)和g(n)也是积性函数, 则h(n)也是积性函数

 

题解: 

给你一个n唯一分解后的底数和指数, 然后问

\sum _{ d|n }^{ }{ \varphi (n)\frac { n }{ d } }

很显然  这个东西可以写成狄利克雷卷积

h(n)\quad =\quad \sum _{ d|n }^{ }{ \varphi (n)\frac { n }{ d } }

的形式 并且 h(n) 是一个积性函数

 

又因为 n\quad =\quad { p1 }^{ q1 }\quad *{ \quad p2 }^{ q2 }\quad *\quad ---\quad *{ pn }^{ qn }

所以: h(n)\quad =\quad h({ p1 }^{ q1 })\quad *{ \quad h(p2 }^{ q2 })\quad *\quad ---\quad *h({ pn }^{ qn })

\\ h({ p }^{ q })\quad =\quad \sum _{ d\quad |\quad { p }^{ q } }^{ }{ \varphi (d)\frac { { p }^{ q } }{ d } } \\ d\quad =\quad \{ 1,\quad p,\quad { p }^{ 2 },\quad ---,\quad { p }^{ d }\} \\ \\ h({ p }^{ q })\quad =\quad \varphi (1)\frac { { p }^{ q } }{ 1 } \quad +\quad \sum _{ i }^{ q }{ \varphi ({ p }^{ i }) } \frac { { p }^{ q } }{ { p }^{ i } } \\ \qquad \quad \quad =\quad { p }^{ q }\quad +\quad \sum _{ i }^{ q }{ { p }^{ i }(1\quad -\quad \frac { 1 }{ p } )\quad { p }^{ q\quad -\quad i } } \\ \quad \quad \quad \quad \quad =\quad { p }^{ q }\quad +\quad \sum _{ i }^{ q }{ { p }^{ q }(1\quad -\quad \frac { 1 }{ p } )\quad } \\ \qquad \quad \quad =\quad { p }^{ q }\quad +\quad { p }^{ q }(1\quad -\quad \frac { 1 }{ p } )\quad *\quad q\\ \\

然后 瞎暴力写就好了。。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const LL mod = 998244353;

LL quick_mod(LL a, LL b, LL m){
    LL ans = 1;
    while(b){
        if(b & 1){
            ans = ans * a % m;
            b--;
        }
        b >>= 1;
        a = a * a % m;
    }
    return ans;
}
int main(){
    int T;
    scanf("%d", &T);
    while(T--){
        int N;
        scanf("%d", &N);
        LL A = 1;
        while(N--){
            LL p, q;
            scanf("%lld%lld", &p, &q);
            LL ans = 1;
            ans = ans * quick_mod(p, q, mod);
            LL temp = 1;
            temp = q % mod * (p - 1) % mod;
            temp %= mod;
            temp = temp * quick_mod(p, q - 1, mod) % mod;
            temp %= mod;
            ans += temp;
            ans %= mod;

            A = A * ans % mod;
        }
        printf("%lld\n", A  % mod);
    }
    return 0;
}

代码比较丑 - - - 233333 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值