CCPC-2017 杭州站B丨HDU - 6265丨数论丨积性函数 丨欧拉函数丨狄利克雷卷积丨思维变换
程序员文章站
2022-04-27 13:17:25
...
【参考博客】@WJHKDGHP ccpc2017杭州站 B
【参考博客】@灬从此以后灬 2017 CCPC 杭州 HDU6265B 积性函数
特别感谢以上两位博主,让我看懂了许多细节。
交题网址(HDU-6265)
题意:依次输入一个整数分解质因数的各项底数与指数,求算:
思路:(其实最开始还有些数学常识的不足,比如d|n 表示 “d可整除n”,也就是n的因子)
首先狄利克雷
识破三连:
1. 如果你见过狄利克雷卷积:
2. 又知道两个积性函数的狄利克雷卷积也是积性函数。
3. 还知道欧拉函数和都是积性函数 。
那么就可以“一眼看出”积性函数:
由于积性函数
的特性: 这就契合输入的格式,下面要解决的是就是如何求。
由题给公式可以得到:(p是质数(n的质因子),d所有可取的值有)
欧拉函数
有:(注意* k=0的时候是不满足的)
【证明参阅】Value for a prime power argument
于是我们可以进一步化解:
到此,我们可以得到计算答案的公式了: (略去了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
*/
上一篇: Processing-对象(class)
下一篇: 了解下STRAIGHT_JOIN