7366. 【2021.11.10NOIP提高组联考】可怜的木偶
Description
可怜的木偶在数轴上表示 \(k !\) 的点上,她有 \(n\) 个虚幻的袋鼠,她可以使用第 \(i\) 个虚幻的袋鼠让自己向前 或向后移动 \(a_{i}\) 的距离,但她必须时刻保证自己的坐标为正整数,在这种规则下可怜的木偶的坐标最小值 为使用任意多次虚幻的袋鼠能达到的最小坐标。
但是你考虑这样一件事情,就是说:可悲的天使愤怒地爬来爬去着。所以每个 \(a_{i}\) 都是在 \([1, k]\) 内等概率 随机的 (注: 对于第 \(i\) 个虚幻的袋鼠, \(a_{i}\) 是在一开始随机的,而不是对于每次使用随机)。
现在可怜的木偶想知道自己期望的坐标最小值,对 \(998244353\) 取模,如果你不能立刻求出来,那么残 酷的智慧就会被残酷的袋鼠所无知地遗弃。这真的是伟大的啊!!!
\(1\le n\le 10^9,1\le k\le 10^6\)。
Solution
注意到起点为 \(k!\),这意味着我们一定可以走到 0。
那么这个题目就转换成了期望 \(\gcd\)。
设 \(f_x\) 表示 \(\gcd\) 恰好为 \(x\),\(g_x\) 表示 \(x|\gcd\)。
就有
\(g_x=\sum_{x|d} f_d\)
可以莫反得到
\(f_x=\sum_{x|d} \mu(\frac{d}{x}) g(d)\)
\(f_x=\sum_{x|d} \mu(\frac{d}{x})\lfloor\frac{k}{d}\rfloor^n\)
答案就是 \(\frac{\sum^n_{i=1}i\times f(i)}{k^n}\)。
\(k^n\) 先不管,想一下上面怎么再优化一下。
我们把他展开一下得到
\(\sum_{d1=1}^k\sum_{d2=1}^{\lfloor\frac{k}{d1}\rfloor} \mu(d2)\lfloor\frac{k}{d1\times d2}\rfloor^n\)
这里我们枚举 \(d1\times d2\),得到
\(\sum_{i=1}^k\lfloor\frac{k}{i}\rfloor^n\sum_{j|i}j\times \mu(\frac{i}{j})\)
而 \(\sum_{j|i}j\times \mu(\frac{i}{j})\) 可以用狄利克雷卷积变成 \(\varphi(i)\)。
因此最后的答案就是
Code
#include<cstdio>
#define mod 998244353
#define ll long long
using namespace std;
int prt,pri[1000005],phi[1000005],T;
ll n,k,ans,sum;
ll ksm(ll x,ll y)
{
ll res=1;
while (y)
{
if (y&1) res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
int main()
{
freopen("dance.in","r",stdin);
freopen("dance.out","w",stdout);
phi[1]=1;
for (int i=2;i<=1000000;++i)
{
if (!phi[i])
{
pri[++prt]=i;
phi[i]=i-1;
}
for (int j=1;j<=prt;++j)
{
int x=i*pri[j];
if (x>1000000) break;
if (i%pri[j]==0)
{
phi[x]=phi[i]*pri[j];
break;
}
phi[x]=phi[i]*(pri[j]-1);
}
}
scanf("%d",&T);
while (T--)
{
scanf("%lld%lld",&n,&k);
sum=0;
for (int i=1;i<=k;++i)
sum=(sum+ksm((k/i),n)*phi[i]%mod)%mod;
ans=sum*ksm(ksm(k,n),mod-2)%mod;
printf("%lld\n",ans);
}
return 0;
}