正题
题目大意
定义函数f(x)f(x)f(x)表示有多少长度为nnn的序列使得其中全都是xxx的约束,然后每个序列的贡献是这个序列的gcdgcdgcd再gcdgcdgcd上一个BBB。
给出n,m,Bn,m,Bn,m,B,求∑i=1mf(i)\sum_{i=1}^mf(i)∑i=1mf(i)。
解题思路
我们发现fff是一个积性函数,所以我们考虑用线性筛。
首先我们要预处理出所以f(pc)f(p^c)f(pc)(ppp为质数),我们定义ddd为最大的一个xxx使得px∣Bp^x|Bpx∣B,有
f(pc)={∑i=0cpi∗[(c−i+1)n−(c−i)n](c≤d)pd∗(c−d+1)n+∑i=0d−1pi∗[(c−i+1)n−(c−i)n](c>d)f(p^c)=\left\{\begin{matrix} \sum_{i=0}^c p^i*[(c-i+1)^n-(c-i)^n]\ \ \ \ \ (c\leq d) \\\ p^d*(c-d+1)^n+\sum_{i=0}^{d-1} p^i*[(c-i+1)^n-(c-i)^n] \ \ \ \ (c>d) \end{matrix}\right.f(pc)={∑i=0cpi∗[(c−i+1)n−(c−i)n] (c≤d) pd∗(c−d+1)n+∑i=0d−1pi∗[(c−i+1)n−(c−i)n] (c>d)
然后我们发现此式子可以递推,然后用积性函数的性质,然后可以做到O(m)O(m)O(m)推出f(1∼m)f(1\sim m)f(1∼m)
codecodecode
/*#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll XJQ=998244353,N=21000000;
ll n,m,f[N],ans,p[80],pri[N],cnt,B;
bool v[N];
ll power(ll x,ll b)
{ll ans=1;while(b){if(b&1) ans=(ll)ans*x%XJQ;x=(ll)x*x%XJQ;b>>=1;}return ans;
}
int main()
{//freopen("sequence.in","r",stdin);//freopen("sequence.out","w",stdout);scanf("%lld%lld%lld",&n,&m,&B);f[1]=1;p[1]=1;for(ll i=1;i<=60;i++)p[i]=power(i,n);for(ll i=2;i<=m;i++){if(!v[i]){ll d=0,P=1,last=1;pri[++cnt]=i; while(!(B%i)) B/=i,d++; for(ll j=i,c=1;j<=m;j*=i,c++){v[j]=1;if(c<=d){(f[j]=f[j/i]*i%XJQ+p[c+1]-p[c]+XJQ)%=XJQ;last=f[j];P=j;}else{f[j]=(last*i%XJQ+p[c+1]-p[c])%XJQ-(P*i)%XJQ*(p[c-d]-p[c-d-1])%XJQ;last=f[j];(f[j]+=P*p[c-d])%=XJQ;f[j]=(f[j]+XJQ)%XJQ; }}}for(ll j=1;j<=cnt;j++){if(!(i%pri[j])||i*pri[j]>m) break;//v[pri[j]*i]=1;for(ll k=pri[j];i*k<=m;k*=pri[j])v[i*k]=1,f[i*k]=f[i]*f[k]%XJQ;}}for(ll i=1;i<=m;i++)(ans+=f[i])%=XJQ;printf("%lld",ans);
}