欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CCPC-2017 杭州站B丨HDU - 6265丨数论丨积性函数 丨欧拉函数丨狄利克雷卷积丨思维变换

程序员文章站 2022-04-27 13:17:25
...

【参考博客】@WJHKDGHP ccpc2017杭州站 B
【参考博客】@灬从此以后灬 2017 CCPC 杭州 HDU6265B 积性函数
特别感谢以上两位博主,让我看懂了许多细节。

CCPC-2017 杭州站B丨HDU - 6265丨数论丨积性函数 丨欧拉函数丨狄利克雷卷积丨思维变换
交题网址(HDU-6265)
题意:依次输入一个整数分解质因数的各项底数与指数,求算:

d|nφ(d)×nd

思路:(其实最开始还有些数学常识的不足,比如d|n 表示 “d可整除n”,也就是n的因子)

首先狄利克雷识破三连:
1. 如果你见过狄利克雷卷积:(f×g)(n)=d|nf(d)×g(nd)
2. 又知道两个积性函数的狄利克雷卷积也是积性函数。
3. 还知道欧拉函数和f(x)=x都是积性函数 。
那么就可以“一眼看出”积性函数:

h(d)=d|nφ(d)×nd

由于积性函数的特性:h(d)=i=1mh(piqi) 这就契合输入的格式,下面要解决的是就是如何求h(pq)
由题给公式可以得到:(p是质数(n的质因子),d所有可取的值有{1,p,p2,,pq})

h(pq)=d|pqφ(d)×pqd=i=0qφ(pi)×pqi

欧拉函数有:(注意* k=0的时候是不满足的)

φ(pk)=pk(11p)

【证明参阅】Value for a prime power argument
于是我们可以进一步化解:
h(pq)=pq+i=1qpi(11p)×pqi
=pq+pq1(p1)·q

到此,我们可以得到计算答案的公式了:ans=pq+pq1(p1)·q (略去了i)
也就是说每次输入一组 p和q,计算结果累乘到答案上即可!
参考代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 89444;
typedef long long ll;
const ll mod = 998244353;
int T;

ll fpow(ll a,ll b)
{
    ll ret=1;
    while(b)
    {
        if(b&1)ret=ret*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ret;
}

int main()
{
    int T,m;
    ll q,p,ans,tmp;
    scanf("%d",&T);
    while(T--)
    {
        ans=1;
        scanf("%d",&m);
        while(m--)
        {
            scanf("%lld%lld",&p,&q);
            tmp=1;
            tmp=tmp*(p-1)%mod;
            tmp=tmp*q%mod;
            tmp=tmp*fpow(p,q-1)%mod;
            tmp=(tmp+fpow(p,q))%mod;
            ans=ans*tmp%mod;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
/*
2
2
2 1
3 1
2
2 2
3 2
*/